蒙提霍爾悖論又稱三門問題Monty Hall Problem,這個問題出自美國的電視游戲節(jié)目Let's Make a Deal。問題名字來自該節(jié)目的主持人蒙提·霍爾(Monty Hall)。在這個秀上有三扇門,其中有一扇門打開后可以獲得一輛汽車,而其余的兩扇門打開后則是山羊。
游戲規(guī)則
游戲的步驟如下:
- 參加游戲的人選定其中的一扇門
- 主持人選擇另外兩扇門中的一扇,且打開后只能是山羊,而不能是汽車
- 給參加游戲的人一個是否交換剩下兩扇門的機會
- 游戲者做出決定,并打開門
這個悖論的關鍵在于:挑戰(zhàn)者是應該選擇交換還是選擇堅持?這兩種做法有沒有區(qū)別?
從理論的角度分析
一般來說,大多數(shù)的挑戰(zhàn)者在選擇后會認為其實換不換無所謂,其概率是相等的。但是實際上,如果交換的話會有更大的機率獲得汽車。現(xiàn)在我們從理論的角度去考慮這個問題:
首先,我們假設有三扇門,分別為門1,門2, 門3,且挑戰(zhàn)者選擇了門1。
很顯然,汽車在每扇門后的概率為:
| 門1 | 門2 | 門3 | |
|---|---|---|---|
| 對應門后有汽車的概率 | 1/3 | 1/3 | 1/3 |
按照游戲規(guī)則,接下來主持人需要為挑戰(zhàn)者去除一個干擾項:
| 門1 | 門2 | 門3 | |
|---|---|---|---|
| 對應門后有汽車的概率 | 1/3 | 1/3 | 1/3 |
| 去除一個干擾項 | 去除門2:1/2, 去除門3:1/2 | 只能去除門3:1 | 只能去除門2:1 |
這一步是由挑戰(zhàn)者確定是否交換,對于不交換的情況,那只有門1是汽車的時候,挑戰(zhàn)者才能拿到汽車的獎勵,此時的概率為1/3,而對于交換的情況,只要不是門1的情況,都可以獲得獎勵,概率為2/3。如下表:
| 門1 | 門2 | 門3 | |
|---|---|---|---|
| 對應門后有汽車的概率 | 1/3 | 1/3 | 1/3 |
| 去除一個干擾項 | 去除門2:1/2, 去除門3:1/2 | 只能去除門3:1 | 只能去除門2:1 |
| 不交換,獲得汽車的概率 | P(獲得汽車) = 1/3 * 1/2 + 1/3 * 1/2 =1/3 | P(獲得汽車) = 0 | P(獲得汽車) = 0 |
| 交換后獲得汽車的概率 | P(獲得汽車) = 0 | P(獲得汽車) = 1/3 * 1 = 1/3 | P(獲得汽車) = 1/3 * 1 = 1/3 |
由此可以看出,直覺中換不換概率相等的認識是錯誤的。
程序模擬源碼
前面一節(jié)對蒙提霍爾悖論做了一些簡單的分析,這一部分會用程序來模擬,并得出了相似的結(jié)果。源碼如下:
# monty problem
# code is not optimal, but it can demonstrate the problem
import random
def open_the_door( doors, player_choice ):
# choose which door should be open
sample = [0,1,2]
if doors[player_choice]:
sample.remove(player_choice)
open_door = random.choice(sample)
else:
for index, value in enumerate(doors):
if index != player_choice and not value:
open_door = index
return open_door
def monty_problem( total_times, exchange = False ):
bingo = 0
for i in range(total_times):
doors = [False, False, False]
doors[random.randint(0,2)] = True
player_choice = random.randint(0,2)
open_door = open_the_door(doors, player_choice)
if exchange:
difference = set([0, 1, 2]) - set([player_choice, open_door])
player_choice = list(difference)[0]
if doors[player_choice]:
bingo += 1
print('P(exchange={}) = {}'.format(exchange ,bingo / total_times))
if __name__ == '__main__':
monty_problem(100000, False)
monty_problem(100000, True)
運行結(jié)果如下:
P(exchange=False) = 0.33178
P(exchange=True) = 0.66669
從這里可以看出,不交換和交換的概率分別接近在上一部分的推理結(jié)果。這一部分請自行驗證。
總結(jié)
其實這個問題還可以從另外一個角度,憑直覺給出答案。比如說,現(xiàn)在不僅僅是只有3扇門,而是有100扇,甚至是1000扇門,那么在你選擇了其中的一扇門后,打開其余不是汽車的98或998扇門,那么這個時候,你是換還是不換呢?