像@Henry一样,我真的不觉得您的解决方案是蒙特卡洛。当然,您从分布中采样,但它与模仿数据生成过程没有太大关系。如果您想使用 Monte Carlo 让某人相信理论解决方案是正确的,则需要使用模拟数据生成过程的解决方案。我想它是这样的:
boxes <- list(
c(0, 0),
c(0, 1),
c(1, 1)
)
count_successes = 0
count_valid_samples = 0
for (i in 1:5000) {
sampled_box <- unlist(sample(boxes, 1)) # sample box
sampled_balls <- sample(sampled_box) # shuffle balls in the box
if (sampled_balls[1] == 1) { # if first ball is golden
if (sampled_balls[2] == 1) { # if second ball is golden
count_successes = count_successes + 1
}
count_valid_samples = count_valid_samples + 1
}
}
count_successes / count_valid_samples
或使用“矢量化”代码:
mean(replicate(5000, { # repeat 5000 times, next calculate empirical probability
x <- boxes[[sample(3, 1)]] # pick a box
if (x[sample(2, 1)] == 1) # pick a ball, check if it is golden
return(sum(x) == 2) # check if you have two golden balls in the box
else
return(NA) # ignore if sampled ball is silver
}), na.rm = TRUE) # not count if silver
请注意,由于您的条件是第一个球已经被绘制并且它是金色的,所以上面的代码可以简单地使用两个盒子boxes <- list(c(0, 1), c(1, 1))
然后从中采样x <- boxes[[sample(2, 1)]]
,所以代码会更快,因为它不会使 1/3我们打折的空运行。然而,由于问题很简单,代码运行速度很快,我们可以明确地模拟整个数据生成过程,“以确保”结果是正确的。除此之外,不需要此步骤,因为它会在两种情况下产生相同的结果。