在 R 中模拟掷骰子

sta*_*oob 5 loops average r probability data-manipulation

我正在尝试用 R 编写以下游戏:

  • 掷骰子,直到出现 4,然后出现 6
  • 计算一下您观察到 4 后跟 6 需要多少次
  • 重复前两个步骤 100 次
  • 计算观察到 4 和 6 所需的平均次数

我尝试手动模拟如下 - 我首先使用 R 中的“runif”命令多次“掷骰子”,希望您最终会看到 4 后面跟着 6 (我不知道如何使用“直到循环”进行编码)。我重复了 100 次,并将所有这些卷放入数据框中:

roll_1 = floor(runif(100, min=1, max=6))

roll_2 = floor(runif(100, min=1, max=6))

roll_3 = floor(runif(100, min=1, max=6))

roll_4 = floor(runif(100, min=1, max=6))

roll_5 = floor(runif(100, min=1, max=6))

#etc 

roll_100 = floor(runif(100, min=1, max=6))

all_rolls = data.frame(roll_1, roll_2, roll_3, roll_4, roll_5, roll_100)
Run Code Online (Sandbox Code Playgroud)

这看起来如下:

head(all_rolls)
  roll_1 roll_2 roll_3 roll_4 roll_5 roll_100
1      4      2      5      3      1        4
2      3      2      4      4      1        2
3      1      3      1      4      2        1
4      3      2      1      4      4        3
5      4      1      2      2      5        5
6      2      3      3      5      3        1
Run Code Online (Sandbox Code Playgroud)

然后,我将此数据框导出到 Microsoft Excel 中,并手动检查每一列,并计算前面有 4 时出现 6 的行号。然后,我对所有列计算该数字的平均值,并计算需要滚动的平均次数。在观察 4 和 6 之前先掷骰子。这需要一些时间,但很有效。

我正在寻找一种更快的方法来做到这一点。有谁知道 R 中是否可以使用“do Until”循环来加速这个“游戏”?

谢谢

Ron*_*hah 3

runif我会选择 1:6 值,而sample不是 1:6,因为骰子只有 1 到 6 之间的值,不会有 1.23 等值。

这就是你如何使用while循环 -

roll_from_4_to6 <- function() {
  n <- 1:6
  i <- 1
  previous_4 <- FALSE
  while(TRUE) {
    current_value = sample(n, 1)
    i <- i + 1
    if(previous_4 && current_value == 6) break
    previous_4 <- current_value == 4
  }
  i
}
Run Code Online (Sandbox Code Playgroud)

运行一次。

roll_from_4_to6()
Run Code Online (Sandbox Code Playgroud)

运行100次,取平均值。

mean(replicate(100, roll_from_4_to6()))
Run Code Online (Sandbox Code Playgroud)