基于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
相关产品推荐
相关产品推荐

