R - 多个可变数量的骰子上数字的概率
R - Probability of a number on multiple variable number of die
我正在尝试编写一个 r 脚本,用于在至少一个骰子上滚动骰子上的最高数字(在本例中为 6)以累积一组骰子 (1,2,3,4,5) ,6 个骰子)在任意骰子上(在本例中为 d6;代码应该很容易调整到其他骰子,如 d8 d10 d12)。我正在寻找的结果对于 d6 大致是这样的:
骰子 (p)全 6
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 d6 重复此操作。现在我们需要 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
returns 矩阵中使用 sapply
,我们可以转换为 data.frame 并对其执行一些 dplyr
操作。
library(dplyr)
set.seed(9)
sapply(1:1000, function(i) sapply(1:6, function(z) all(dice(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, times, 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)
.
的序列生成
我正在尝试编写一个 r 脚本,用于在至少一个骰子上滚动骰子上的最高数字(在本例中为 6)以累积一组骰子 (1,2,3,4,5) ,6 个骰子)在任意骰子上(在本例中为 d6;代码应该很容易调整到其他骰子,如 d8 d10 d12)。我正在寻找的结果对于 d6 大致是这样的:
骰子 (p)全 6 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 d6 重复此操作。现在我们需要 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
returns 矩阵中使用 sapply
,我们可以转换为 data.frame 并对其执行一些 dplyr
操作。
library(dplyr)
set.seed(9)
sapply(1:1000, function(i) sapply(1:6, function(z) all(dice(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, times, 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)
.