R
如何編寫伯特蘭盒子悖論的蒙特卡羅模擬?
以下問題已發佈在 Mensa International Facebook 頁面上:
帖子本身收到了 1000 多條評論,但我不會詳細討論那裡的辯論,因為我知道這是伯特蘭的盒子悖論,答案是. 讓我感興趣的是如何使用蒙特卡洛方法回答這個問題?算法如何解決這個問題?
這是我的嘗試:
- 產生之間均勻分佈的隨機數和.
- 讓包含 2 個金球的盒子(盒子 1)被選中的事件少於一半。
- 數一下小於的數並將結果稱為.
- 由於選擇框 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我們打折的空運行。然而,由於問題很簡單,代碼運行速度很快,我們可以明確地模擬整個數據生成過程,“以確保”結果是正確的。除此之外,不需要此步驟,因為它會在兩種情況下產生相同的結果。