如何编写Bertrand盒悖论的蒙特卡罗模拟?


12

在Mensa International Facebook页面上发布了以下问题:

在此处输入图片说明

该帖子本身收到了1000多个评论,但由于我知道这是Bertrand的“盒子悖论”,而答案是,因此我不会在此处详细讨论辩论。让我感兴趣的是,如何使用蒙特卡洛方法回答这一问题?该算法如何解决这个问题?23

这是我的尝试:

  1. 生成到之间的均匀分布的随机数。0 1N01
  2. 让事件框包含选择的2个金球(方框1)小于一半。
  3. 计数数字,小于,并调用结果作为。0.5S
  4. 由于确定如果选择了框1,就肯定会得到金球,如果选择了框2,则只有50%的机会会得到金球,因此,得到序列GG的概率为
    P(B2=G|B1=G)=SS+0.5(NS)

在R中实现上述算法:

N <- 10000
S <- sum(runif(N)<0.5)
S/(S+0.5*(N-S))

上面程序的输出大约是,几乎与正确答案匹配,但是我不确定这是正确的方法。是否有适当的方法以编程方式解决此问题?0.67

Answers:


14

@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盒中取出一个盒?如果是这样,为什么自从我们知道您已经选好一个金球以来为什么有必要?
Anastasiya-Romanova秀

7
@ Anastasiya-Romanova秀,您可以选择从两个框中进行采样boxes <- list(c(0, 1), c(1, 1)),然后x <- boxes[[sample(2, 1)]],但是由于这几乎是相同的计算时间,为什么不使用与采样过程完全相似的额外步骤?它不会改变结果,但可以使模拟明确。
蒂姆

好的,蒂姆,谢谢您的回答。由于我是R语言的新手,请给我些时间首先了解您的答案。现在,为您+1和@Henry。
Anastasiya-Romanova秀

1
@ Anastasiya-Romanova秀是的,完全是。该代码对一个盒子进行采样,然后从该盒子中采样一个球,如果它是金色的(= 1),那么它检查盒子中的另一个球是否也是金色的(1 + 1 = 2),如果是,则对它进行计数最后,将总和除以总数(即mean)。
蒂姆

1
@ Anastasiya-Romanova秀return(NA)返回丢失的值,然后mean(, na.rm = TRUE)使用其中的na.rm = TRUE参数告诉函数忽略丢失的值。在其他编程语言中,这可以以不同的方式完成,例如使用continuepass关键字。
蒂姆

4

我觉得您的S/(S+0.5*(N-S))计算不是真的模拟

试试这个

N <- 10^6
ballsinboxes <- c("G","G", "G","S", "S","S")
selectedbox <- sample(c(1,2,3), N, replace=TRUE)
selectedball <- sample(c(1,2), N, replace=TRUE)
selectedcolour <- ballsinboxes[(selectedbox-1)*2 + selectedball ]
othercolour <- ballsinboxes[(selectedbox-1)*2 + 3 - selectedball ]
sum(selectedcolour == "G" & othercolour == "G") / sum(selectedcolour == "G")

-2

为什么不简单列出案件呢?

在这里:G代表“黄金”,S代表“银”,大写字母代表初始提取:

g

G

s

...其他所有情况都需要初始银(S)提取,但不满足条件提取(初始提取G)。

这样,P(g | G)= 2/3。


7
问题询问有关蒙特卡洛解决方案。
蒂姆

好吧,列出所有可能性是蒙特卡洛的一个极端案例。
ghuezt

4
不,不是,Monte Carlo是关于模拟/随机化的。
蒂姆

蒂姆,弄清楚你的数学。通过无限多次平局,您将准确获得所有具有相等概率的案例的列表。我为“极端情况”感到难过,并表示限制。
ghuezt

1
当然可以,但是列出所有案例并不是蒙特卡罗。正方形是矩形,但矩形不是正方形。
蒂姆
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.