估计m公平的六面骰子的机会

时间:2017-01-16 20:48:16

标签: r dice

De mere problem类似

我想生成一个蒙特卡罗模拟,以估计从n公平六面骰子m卷中至少一个1滚动的概率。

我的代码:

m<-5000
n<-3
x<-replicate(m, sample(1:6,n,TRUE)==1)
p<-sum(x)/m

p是估计的概率。我在这里得到的值为0.4822。

我的问题:

1)没有使用sum做其他方法吗?

2)我怀疑代码是错误的,因为概率可能太高。

1 个答案:

答案 0 :(得分:3)

尽管上述问题有点不清楚,但代码建议您要估计在n个独立骰子中获得至少一个“1”结果的机会,并且您的目标是通过模拟实验m次。

从内到外编制模拟。从单次迭代开始。你开始很好,但要完全清楚,让我们使用高度暗示性的语法重做它。试试这个:

1 %in% sample(1:6,n,TRUE)

这使用sample来实现n独立公平骰子的结果,并检查结果1是否出现在其中。

如果您对此模拟实验(运行多次)感到满意,那么replicate确实会执行模拟:

x <- replicate(m, 1 %in% sample(1:6,n,TRUE))

这会产生m个结果。在1出现的所有迭代中,每个都将为TRUE(解释为等于1),否则将为FALSE(解释为0)。因此,1出现的平均次数可以作为

获得
mean(x)

经验频率是对理论概率的良好估计。

作为一项检查,请注意1出现在单个骰子上,概率为1-1 / 6 = 5/6因此,因为{{1骰子是独立的 - 会出现在任何一个上,概率为(5/6)^ n。因此,n 出现的机会必须为1 - (5/6)^ n。让我们输出这两个值:模拟均值和理论结果。我们可能还包括 Z得分,它是衡量平均值离理论结果有多远的度量。通常情况下,Z分数在-2和2之间并不是任何差异的重要证据。

这是完整的代码。虽然有更快的方式来编写它,但这已经非常快了,并且就像人们可以做到的那样清晰。

1

输出

  

平均理论Z.score

     

0.4132 0.4213 -1.1600

请注意,两个结果都不在m <- 5000 # Number of simulation iterations n <- 3 # Number of dice per iteration set.seed(17) # For reproducible results x <- replicate(m, 1 %in% sample(1:6,n,TRUE)) # Compare to a theoretical result. theory <- 1-(5/6)^n avg <- mean(x) Z <- (avg - theory) / sd(x) * sqrt(length(x)) c(Mean=signif(avg, 5), Theoretical=signif(theory, 5), Z.score=signif(Z, 3)) 附近,即1/2 = 0.500。