sta*_*oob 5 loops average r probability data-manipulation
我正在尝试用 R 编写以下游戏:
我尝试手动模拟如下 - 我首先使用 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”循环来加速这个“游戏”?
谢谢
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)