我想生成一个蒙特卡罗模拟,以估计从n
公平六面骰子m
卷中至少一个滚动的概率。
我的代码:
m<-5000
n<-3
x<-replicate(m, sample(1:6,n,TRUE)==1)
p<-sum(x)/m
p是估计的概率。我在这里得到的值为0.4822。
我的问题:
1)没有使用sum
做其他方法吗?
2)我怀疑代码是错误的,因为概率可能太高。
答案 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。