反直覺的三門問題

趙孤鴻發表於2020-10-25

三門問題又被稱為蒙提霍爾問題,是一個很反直覺的問題,出自美國的一個電視遊戲節目。

題目非常簡單:參賽者面前有三扇門,其中一扇門後面有一輛小汽車,另外兩扇門後面都是山羊,如果參賽者選中有汽車的那扇門,就可以把汽車開回家。

當參賽者選擇了其中一扇門後,此時主持人開啟剩餘兩扇門其中的一扇,裡面是一隻山羊,那麼現在主持人給參賽者一次重新選擇的機會,那麼參賽者應不應該換門去選擇另外一扇門?

我初次看這個問題時覺得當主持人開啟一扇門後,那麼小汽車在剩餘兩個門內的概率必然都是 50%,那麼換不換門其實意義不大,因為概率都一樣,但真的是這樣嗎?

正確答案卻是非常反直覺的,如果參賽者堅持原來的選擇,那麼選中小汽車的概率為 1/3,如果換門的話,選中小汽車的概率為 2/3。

直觀分析

首先我們要明確一點,主持人是知道小汽車在哪個門後面的,這個是解題的前提,否則下面的分析毫無意義。

下面我們來分析一下:當參賽者第一次選擇時,任何一扇門有小汽車的概率都是 1/3,所以參賽者所選門後面有小汽車的概率是 1/3,參賽者未選擇的兩扇門後面有小汽車的概率為 2/3。

當主持人開啟剩餘兩扇門其中的一扇有山羊的門,那 2/3 的概率就轉移到了剩餘兩扇門中未被開啟的那扇門中,而此刻參賽者最初選擇的門仍然只有 1/3 的概率選中小汽車,所以說此時換門是最佳的選擇。

圖示法

如果上述直觀的分析過程不太好理解的話,那麼我們通過畫圖的方式,可以很直觀的看到每種選擇的概率

假設三個門分別為A,B,C,參賽者選擇了A門,如圖所示

可以很很清楚的看到

如果不換門,選中的概率為 1/3 * 1/2 + 1/3 * 1/2 + 0 + 0 = 1/3

如果換門,選中的概率為 0 + 0 + 1/3 * 1+ 1/3 * 1 = 2/3

極端假設

如果此時你還是不理解的話,我們可以做個極端的假設

假如有一萬扇門,9999 扇門背後都是羊,只有一扇門背後是小汽車。在你選擇了一扇門後,此時主持人開啟剩餘的 9999 扇門中的 9998 扇門,並且背後都是羊,那麼此時讓你重新選擇,你換不換門,我相信此時大多數人哪怕憑直覺也會覺得,換門後選中小汽車的概率更大。

排除法

還有個思路,你可以理解三個答案中只有一個是正確答案,你隨機選擇了一個,然後主持人在剩餘的兩個答案中排除掉了錯誤的一個,這個時候給你一次重新選擇的機會你確定不換嗎?

用資料說話

實踐是檢驗真理的唯一標準,我寫了個簡單的程式,對這個遊戲模擬了 100 萬次。

import random

# 模擬測試的次數
simulationCount = 1000000
# 第一次選中小汽車的次數
firstSelectedSuccessSum = 0
# 第二次重新選擇選中小汽車的次數
secondSelectedSuccessSum = 0
for num in range(simulationCount):
    # 初始化所有門
    doors = list(range(1,4))
    # 隨機生成小汽車的門位置
    carDoor = random.randint(1,3)
    # 參賽者隨機選中一個
    firstSelectedDoor = random.randint(1,3)
    # 主持人在剩下的兩個裡面隨機選擇一個
    doors.remove(firstSelectedDoor)
    presenterSelectedDoor = doors[random.randint(0,1)]
    # 主持人選擇後剩下的一個門,也就是選手第二次選擇的門
    doors.remove(presenterSelectedDoor)
    secondSelectedDoor = doors[0]
    # 因為主持人不能選擇有小汽車的門
    # 所以如果上面主持人隨機選擇的是有小汽車的門,則應該重新選擇另一個門
    if carDoor == presenterSelectedDoor:
        secondSelectedDoor = presenterSelectedDoor
    # 如果第一次選中有小汽車的門,累計計數
    if carDoor == firstSelectedDoor:
        firstSelectedSuccessSum = firstSelectedSuccessSum + 1
    # 如果第二次重新選擇選中有小汽車的門,累計計數
    elif carDoor == secondSelectedDoor:
        secondSelectedSuccessSum = secondSelectedSuccessSum + 1
# 輸出測試結果
print ('模擬測試 %s 次'%simulationCount)
print ('不換門選中小汽車的次數為 {} 次,概率為:{:.2%}'.format(firstSelectedSuccessSum, firstSelectedSuccessSum/simulationCount))
print ('換門後選中小汽車的次數為 {} 次,概率為:{:.2%}'.format(secondSelectedSuccessSum, secondSelectedSuccessSum/simulationCount))

執行結果為

模擬測試 1000000 次
不換門選中小汽車的次數為 333398 次,概率為:33.34%
換門後選中小汽車的次數為 666602 次,概率為:66.66%

結果顯而易見,和上述分析的結果一樣,堅持最初的選擇,選中小汽車概率 1/3,換門後選中小汽車概率 2/3。

如果主持人是隨機選的門呢

上面已經說過,主持人是知道小汽車在哪個門後面的,所以主持人可以保證自己開啟的一定是後面有山羊的門。

那麼肯定有人會問,如果主持人不知道小汽車在哪個門後面,隨便選了一個,並且恰好選擇了有羊的門,那麼此時參賽者換門和不換門選中小汽車的概率各有多大?

這種情況就要分兩個維度來看了

維度一:如果從主持人已經開啟了一扇有羊的門這個既定事件往後看,那麼此時換門和不換門選中小汽車的概率均為 50%。

維度二:如果從主持人開啟門之前開始往後看,那麼換門和不換門選中小汽車的概率均為 1/3,因為還有三分之一的概率是主持人開啟了有小汽車的門,在這種情況下,遊戲直接結束了。

總結

三門問題看似有點違背常理,但只要經過認真思考後,其實也不難理解。

因為最後參賽者重新選門的事件是受前面主持人開門事件所影響的,正是因為主持人是知道小汽車在哪個門後面的,所以主持人在開啟門的時候,會刻意避開有小汽車的門,也就造成了後面換門和不換門選擇小汽車的概率不均等。明白了這一點,我相信你對換門後選中小汽車的概率為 2/3 也就不會有異議了。

相關文章