如何在R中实现带条件额外掷骰的骰子成功数模拟?
R骰子模拟问题解决
现有代码问题分析
- 你写的
for (i in 1:6)是遍历1到6这几个数字,和roll向量里的掷骰结果完全没关系,所以这个循环根本不会修改roll,自然看不到效果。 - 完全没处理掷出6时的额外掷骰逻辑。
解决方案代码(基础R)
x <- 10 total_success <- 0 all_rolls <- c() # 记录所有掷骰结果 # 初始需要掷的骰子数 remaining_rolls <- x # 处理额外掷骰的循环:只要还有要掷的骰子就继续 while (remaining_rolls > 0) { # 掷当前需要的骰子数 current_roll <- sample(1:6, remaining_rolls, replace = TRUE) all_rolls <- c(all_rolls, current_roll) # 追加到总结果里 # 计算本次掷骰的成功数 current_success <- sum( ifelse(current_roll <= 3, 0, ifelse(current_roll == 4, 1, 2)) # 5和6都得2 ) total_success <- total_success + current_success # 统计本次掷出6的数量,作为下一次要掷的额外骰子数 remaining_rolls <- sum(current_roll == 6) } # 输出结果 cat("所有掷骰记录:", all_rolls, "\n") cat("总成功数:", total_success, "\n")
代码说明
- 用
while循环处理无限额外掷骰的规则:每次掷完后,统计掷出6的数量,作为下一轮要掷的骰子数,直到没有6出现(remaining_rolls为0)。 - 用向量操作
ifelse替代逐个元素循环,R里向量运算比单元素循环效率高得多。 all_rolls会记录每一次掷骰的结果,满足你输出每次掷骰结果的需求。
可选:用dplyr简化逻辑
如果觉得嵌套ifelse看着麻烦,可以用dplyr包的case_when,语法更直观:
# 先安装并加载dplyr(第一次用需要安装) # install.packages("dplyr") library(dplyr) x <- 10 total_success <- 0 all_rolls <- c() remaining_rolls <- x while (remaining_rolls > 0) { current_roll <- sample(1:6, remaining_rolls, replace = TRUE) all_rolls <- c(all_rolls, current_roll) current_success <- sum( case_when( current_roll <= 3 ~ 0, current_roll == 4 ~ 1, TRUE ~ 2 # 5和6都匹配这里 ) ) total_success <- total_success + current_success remaining_rolls <- sum(current_roll == 6) } cat("所有掷骰记录:", all_rolls, "\n") cat("总成功数:", total_success, "\n")
内容的提问来源于stack exchange,提问作者Wyatt Alvis
相关产品推荐
相关产品推荐

