R

如何編寫伯特蘭盒子悖論的蒙特卡羅模擬?

  • December 18, 2017

以下問題已發佈在 Mensa International Facebook 頁面上:

在此處輸入圖像描述

帖子本身收到了 1000 多條評論,但我不會詳細討論那裡的辯論,因為我知道這是伯特蘭的盒子悖論,答案是. 讓我感興趣的是如何使用蒙特卡洛方法回答這個問題?算法如何解決這個問題?

這是我的嘗試:

  1. 產生之間均勻分佈的隨機數和.
  2. 讓包含 2 個金球的盒子(盒子 1)被選中的事件少於一半。
  3. 數一下小於的數並將結果稱為.
  4. 由於選擇框 1 肯定會得到金球,而選擇框 2 則只有 50% 的機會獲得金球,因此得到序列 GG 的概率為

在 R 中實現上述算法:

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

上面程序的輸出是這幾乎與正確答案匹配,但我不確定這是正確的方法。是否有適當的方法以編程方式解決此問題?

像*@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我們打折的空運行。然而,由於問題很簡單,代碼運行速度很快,我們可以明確地模擬整個數據生成過程,“以確保”結果是正確的。除此之外,不需要此步驟,因為它會在兩種情況下產生相同的結果。

引用自:https://stats.stackexchange.com/questions/319344

comments powered by Disqus