You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于R语言的掷双骰(24次)胜率计算代码故障求助

问题分析与修正方案

你的代码核心问题出在最后计算胜率的部分,逻辑完全错误,前面的代码也可以优化:

原代码的问题点

  • 最后一段for (i in 24)循环毫无意义,只会执行一次(i=24),且Die1和Die2仅保留最后一次掷骰的结果,无法统计24次掷骰里的双六次数。
  • 胜率计算逻辑错误:你需要统计的是「24次掷骰中至少出现一次双六」的概率,或者多次模拟游戏后的获胜比例,原代码的throws/2 *100完全不符合需求。
  • 前面的throws向量存的是骰子和,其实直接记录是否掷出双六会更直观。

修正后的代码

1. 单次游戏(掷24次双骰)的结果

先修改代码,直接记录每次是否掷出双六,然后判断是否获胜:

# 初始化向量,记录每次掷骰是否是双六
is_double_six <- logical(24)

for(i in 1:24) {
  die1 <- sample(1:6, size = 1)
  die2 <- sample(1:6, size = 1)
  is_double_six[i] <- (die1 == 6 & die2 == 6)
}

# 判断本次游戏是否获胜(至少一次双六)
game_won <- any(is_double_six)
game_won

# 本次游戏中双六出现的次数
double_six_count <- sum(is_double_six)
double_six_count

2. 多次模拟计算胜率

如果要计算「玩一次游戏(24次掷骰)的胜率」,需要多次重复整个游戏过程,统计获胜次数的比例:

# 设置模拟次数
simulations <- 10000
# 记录每次模拟是否获胜
win_results <- logical(simulations)

for(sim in 1:simulations) {
  is_double_six <- logical(24)
  for(i in 1:24) {
    die1 <- sample(1:6, size = 1)
    die2 <- sample(1:6, size = 1)
    is_double_six[i] <- (die1 == 6 & die2 == 6)
  }
  win_results[sim] <- any(is_double_six)
}

# 计算胜率(百分比)
win_rate <- mean(win_results) * 100
cat("模拟", simulations, "次后的胜率为:", round(win_rate, 2), "%\n")

3. 更简洁的向量化写法(避免嵌套循环)

R里可以用向量化操作简化代码,效率更高:

simulations <- 10000
# 每次模拟掷24次双骰,生成24*2的矩阵(每行是一次掷骰的两个骰子)
dice_rolls <- replicate(simulations, matrix(sample(1:6, 24*2, replace = TRUE), ncol = 2))
# 判断每次模拟是否有至少一次双六
win_results <- apply(dice_rolls, 3, function(x) any(x[,1] == 6 & x[,2] == 6))
# 计算胜率
win_rate <- mean(win_results) * 100
cat("模拟", simulations, "次后的胜率为:", round(win_rate, 2), "%\n")

理论上,单次游戏(24次掷骰)的胜率是1 - (35/36)^24 ≈ 49.14%,模拟次数足够多时,结果会接近这个值。

内容的提问来源于stack exchange,提问作者khali-blinks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 00:04:02