三門問題又被稱為蒙提霍爾問題,是一個很反直覺的問題,出自美國的一個電視遊戲節目。
題目非常簡單:參賽者面前有三扇門,其中一扇門後面有一輛小汽車,另外兩扇門後面都是山羊,如果參賽者選中有汽車的那扇門,就可以把汽車開回家。
當參賽者選擇了其中一扇門後,此時主持人開啟剩餘兩扇門其中的一扇,裡面是一隻山羊,那麼現在主持人給參賽者一次重新選擇的機會,那麼參賽者應不應該換門去選擇另外一扇門?
我初次看這個問題時覺得當主持人開啟一扇門後,那麼小汽車在剩餘兩個門內的概率必然都是 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 也就不會有異議了。