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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:12:56