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