如何解决R - 一个数字在多个可变数量的骰子上的概率
我正在尝试编写一个 r 脚本,用于在至少一个骰子上滚动骰子上的最高数字(在本例中为 6),以获得一组累积骰子(1、2、3、4、5、6骰子)在任意骰子上(在这种情况下是 d6;代码应该很容易调整到其他骰子,如 d8 d10 d12)。对于 d6,我正在寻找的结果大致如下:
骰子 (p)全部 6s 1 0.16667 2 0.2334 3 0.2927 ...
z <- 1
b <- c(numeric)
while(z < 6) {
b[z] <- sapply(1:1,function(z) mean(rbinom(10000,z,1/6) > 0))
z <- z + 1
}
b
我最终是这样的:
[1] 0.1631 0.1637 0.1716 0.1623 0.1659 0.1648
我无法让 while 循环正确步进。有什么建议吗?
解决方法
我认为您想要的是一种系统地越来越多地模拟掷骰子的方法。让我们尝试一个基于 sample
的函数:
dice <- function(sides,times){
sample(1:sides,times,replace = TRUE)
}
如果你想投 2d6,那么你做
set.seed(9) # for reproducibility
dice(6,2)
[1] 3 5
假设您想从 1 到 6 d6s 重复此操作。现在我们需要sapply
。您将获得包含所有输出的列表。
set.seed(9)
sapply(1:6,function(z) dice(6,z))
[[1]]
[1] 3
[[2]]
[1] 5 6
[[3]]
[1] 3 3 3
[[4]]
[1] 4 3 6 4
[[5]]
[1] 5 2 5 2 4
[[6]]
[1] 3 4 6 1 6 1
现在您要检查它们是否都等于某个其他值(例如 6)。您可以比较输出并使用 all
。
set.seed(9)
all(dice(6,2) == 6)
[1] FALSE
将其与 sapply
结合,您会得到每个投掷次数的向量。
sapply(1:6,function(z) all(dice(6,z) == 6))
[1] FALSE FALSE FALSE FALSE FALSE FALSE
但是,您想大量重复此操作并估计 TRUE
的数概率。在 sapply
中使用 sapply
会返回一个矩阵,我们可以转换为 data.frame 并对其执行一些 dplyr
操作。
library(dplyr)
set.seed(9)
sapply(1:1000,function(i) sapply(1:6,z) == 6))) %>%
t %>% data.frame %>%
summarise(across(everything(),mean))
X1 X2 X3 X4 X5 X6
1 0.156 0.017 0.005 0.002 0 0
如果您想将其包装在一个函数中,以便您可以选择边、卷数、目标数和重复次数,您可以。
my_fun <- function(sides,target,reps,seed = NULL) {
set.seed = seed
sapply(1:reps,function(i) sapply(1:times,function(z) all(dice(sides,z) == target))) %>%
t %>% data.frame %>%
summarise(across(everything(),mean))
}
my_fun(8,20,2,100000)
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X17 X18 X19 X20
1 0.12556 0.01551 0.00194 0.00023 1e-05 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
但是,如果没有您提供的更多信息(例如生成序列的数学公式),我无法重现您想要的输出。你说你想要的概率不会随着骰子数量的增加而增加。
它们也很容易通过 1/(sides^n)
的序列生成。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。