像@Henry一样,我真的不觉得您的解决方案是蒙特卡洛。当然,您可以从分发中进行抽样,但与模拟数据生成过程没有多大关系。如果要使用蒙特卡洛说服某人理论上的解决方案是正确的,则需要使用模仿数据生成过程的解决方案。我可以想象它像下面这样:
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空运行,我们打折。但是,由于问题很简单并且代码运行很快,因此我们可以“明确”地模拟整个数据生成过程,以确保结果正确。除此之外,不需要此步骤,因为在两种情况下都会产生相同的结果。
x <- boxes[[sample(3, 1)]]
意味着您要从3盒中取出一个盒?如果是这样,为什么自从我们知道您已经选好一个金球以来为什么有必要?