三門問題——亦稱爲蒙提霍爾問題,出自美國的電視遊戲節目Let's Make a Deal。問題的名字來自該節目的主持人蒙提·霍爾(Monty Hall)[2]。問題是這樣的:dom
參賽者面前有三扇關閉着的門,其中一扇的後面是一輛汽車,選中後面有車的那扇門就能夠贏得該汽車,
而另外兩扇門後面則各藏有一隻山羊。當參賽者選定了一扇門,但未去開啓它的時候,主持人會開啓剩
下兩扇門中的一扇,露出其中一隻山羊。主持人其後會問參賽者要不要更換選擇,選另外一扇仍然關着的門。
聽說此節目一經播出就引發了一場熱烈的討論,有人說應該換,有人認爲換不換都同樣。主持人給出的答案是應該換,並在下一期的節目中給出了一個分析表格用來講明她的理由。但這下反對的聲音更大了,在幾千封來信中,反對者達到了9成。[1]oop
在全部認爲該換和不應換的爭論中,正反兩方造成了兩種對立的觀點。post
一種是認爲不換的中獎概率是1/3,換的話將有2/3的概率中獎,所以固然應該換。由於:spa
根據參賽者的選擇,一共有下面三種可能狀況(兩隻山羊分別稱爲山羊A和山羊B):3d
(1) 參賽者選擇山羊A,主持人選擇山羊B; (2) 參賽者選擇山羊B,主持人選擇山羊A; (3) 參賽者選擇了汽車,主持人選擇兩隻山羊的任何一隻
三種狀況概率各爲1/3,若是換的話,前兩種都會中獎,僅第三種不會中獎。因此選擇換的中獎機率爲2/3,不換概率只有1/3。code
下面再來看看「反方」觀點,這種觀點認爲換不換都同樣,概率都是50%。由於:htm
當參賽者選擇一扇門時,他中獎的概率確實只有1/3。但當主持人幫忙排除掉一隻山羊時,
車要麼在參賽者所選的這個門中,要麼在剩下的未被選擇的那扇門中。此時參賽者變動選
擇的話,固然中獎概率會提高到1/2。
還能夠換一個角度來理解。即便他沒有變動選擇,他實際上也作出了選擇,只是選擇的是「不變動」而已。雖然選擇的是「不變」,但不表明他的概率不變。整個過程從新組織一下會更容易看明白:blog
(1) 參賽者選了一扇門但不打開 (2) 此時主持人在剩下的兩扇門中選出一扇後面是山羊的門 (3) 而後參賽者在剩下的兩扇門中再次選擇了第一次選擇的門
因此,他選到車的機率爲50%。遊戲
固然,還有不少「非主流」的觀點,但都經不起推敲,這裏再也不贅述,感興趣的能夠去搜一下。事件
兩種觀點乍一看好像都頗有道理,但它們之中確定有一個是錯誤的。我認爲第一種是正確的,所以分析的重點是解釋爲何另外一種答案是錯誤的。而且後面我會編寫程序來驗證答案。
爲何第二種觀點是錯誤的呢?這是由於當咱們第一次作出選擇時,所基於的樣本總數爲3,此時選定的門後面爲汽車的概率是1/3。而且選定後這一概率不會再改變(第二種答案正是基於概率會變的觀點),由於對於已發生的事件來講,後來發生的事件是不可能影響它的概率的。
千萬不要誤解了上面這句話,這裏談到的是概率,是屢次事件的統計結果,並非肯定的一次已發生事件的結果。例如,當把剩下的兩個門都打開後,就可以肯定第一扇門後面是否爲汽車,但第一扇門的「概率」會所以而改變嗎?不會,由於此時咱們在談的是特定一次的結果,而不是概率。若是咱們將此過程重複不少次,每次選擇一扇門以後都經過另外2扇門來判斷這扇門後面是否是汽車,咱們會發現,此時獲得的概率仍然爲1/3。
第二種答案之因此是錯的,還在於它搞錯了一件事情,當咱們說「當咱們作出選擇時,概率就隨之肯定了」這句話時,其實是在說「三扇門中任何一扇門後面是汽車的概率都是1/3」,而不是「咱們的選擇決定了這件事的概率」。我想不少人都搞錯了這一點,一件事的發生概率是由事物的本質規律決定的,並不會因咱們人類的意志爲轉移。
因此第一次選擇某個門時,此時的概率是肯定的1/3,當主持人排除掉一扇門以後,第一扇門的概率毫不會所以而改變,必然仍然是1/3。也許你還有點繞不過這個彎,爲此咱們來作一個思惟實驗:
假設你是參賽者,臺上放着三個盒子,其中一個盒子中有獎品,另外兩個是空的。
你首先從三個盒子中隨便選擇一個,而後把所選的盒子抱到一間密封的屋子裏面,
但不容許打開盒子,此時主持人在剩下的兩個盒子中打開沒有獎品的那個。試問,
你懷裏的盒子的中獎概率會所以而改變嗎?
是否是有點「薛定諤的貓」的味道?薛定諤的貓是針對量子態的,其真相咱們還不得而知,但對宏觀世界來講,我能夠負責任地說,盒子中獎的概率絕對不會改變。
可能你如今已經可以接受第一次選擇的盒子的中獎概率不會改變這一結論了。但我知道你確定還有最後一個疑問,若是不把這個疑問弄清楚,你永遠也不可能真正弄明白這個問題。爲此,咱們來進行第二個思惟實驗:
假設有2個參賽者A和B,參賽者A按照原來的流程先選擇一扇門,此時主持人把一
扇有山羊的門排除掉了。此時又來了一個參賽者B,他並不知道以前發生的事情,
此時他在剩下的兩扇門中隨便選擇一扇門,他的中獎概率不該該是1/2嗎?也就是
說,剩下的兩扇門的概率不該該都是1/2嗎?
可能你已經看出來了,這實際上就是對第二種觀點的另外一種表述方式,只是把參賽者表述成了A和B 2我的。一樣的2扇門,A和B看到的概率卻不同,這可能嗎?
前面說過,概率其實是事物的固有規律,並不以咱們的意志爲轉移。或者說,世間本沒有「概率」這個東西,每一件事情都是孤立的、肯定的(這裏僅討論宏觀),概率只是通過咱們人類的抽象和總結後獲得的一個概念。每一次,當三扇門被放到臺上時,它的結果都是肯定的,並且任何2次相互之間都不會有任何影響。這就像拋硬幣同樣,雖然你可能已經連續拋了100次正面,但你仍然沒法確定下一次是正面仍是反面。
回到參賽者A和B的問題上來。他們倆到底哪個是正確的呢?
答案是2人都對。
但一扇門的概率怎麼可能便是1/3又是1/2呢?這是由於在整個過程當中,A比B多掌握了一點信息,A瞭解到的是:
剩下的2扇門中被排除了一扇
而對B來講,他看到的是:
三扇門中被排除了一扇
正是由於掌握的信息是不對稱的,所以A可以比B更加準確地作出判斷,進而影響到決策的正確性。也就是說,A「更加正確」,B雖然也沒有錯(題目給他的信息只有那麼多,他只能得出對他來講最爲正確的判斷),但他卻比A要稍遜一籌。若是抽獎重複不少次,A每次都更換選擇而B是隨機選擇,那麼A將大約比B多2/3-1/2=1/6的中獎機會。更有甚者,若是A每次都更換選擇,而B是一個認死理的人,他每次都非要跟A反着幹,那麼結果將會更慘。
若是說了這麼多你內心還保留着一點點疑惑的話,那我再來講一個思惟實驗,這個思惟實驗是個人「終極武器」,每次跟人討論這個問題的時候,只要一說出這個實驗,爭論立馬就平息了。這個實驗是這樣的:
假設你買了一張彩票,此時上帝出現了,祂對你說,小夥子,看到你買了這麼屢次
連一次5塊的都沒中過,此次我決定爲你排除掉一半不能中獎的號碼。 那麼請問,在上帝幫你排除掉那些號碼後,你手裏這張彩票的中獎概率會所以而變
大嗎?若是此時讓你再買一張,你的中獎概率會變大嗎?
我想答案是不言而喻的。
下面咱們用程序來模擬一下,看看究竟是怎樣的。
int totalTimes = 1000000; int bingo = 0; boolean[] boxes; for (int i = 0; i < totalTimes; i++) { // loop 1 million times boxes = new boolean[] {false, false, false}; boxes[random(3)] = true; int myChoice = random(3); int hostChoice = openNoPrizeOne(boxes, myChoice); // 判斷另外一個盒子是否中獎等同於判斷開始選的盒子沒有中獎 if (!boxes[myChoice]) { bingo++; } } // 更換選擇的中獎概率 double ratio = (double) bingo * 100 / totalTimes; System.out.println("主持人幫忙排除一個山羊:" + ratio + "%"); return ratio;
其中,random()方法用來生成一個小於參數的隨機非負整數。openNoPrizeOne()用來在剩下的門中排除掉一個山羊。
運行這段程序,能夠發現最後的結果確實在2/3附近,例以下面是某次運行的結果:
下面再來看看上面第二個思惟實驗中,參賽者A和參賽者B的概率各是多少:
int totalTimes = 1000000; int bingoA = 0; int bingoB = 0; boolean[] boxes; for (int i = 0; i < totalTimes; i++) { // loop 1 million times boxes = new boolean[] {false, false, false}; boxes[random(3)] = true; int aChoice = random(3); int hostChoice = openNoPrizeOne(boxes, aChoice); // 判斷另外一個盒子是否中獎等同於判斷開始選的盒子沒有中獎 if (!boxes[aChoice]) { bingoA++; } // 參賽者B各有1/2的概率選擇A所選的和剩下的那扇門 boolean isChoiceSameAsA = (random(2) == 1); if (isChoiceSameAsA && boxes[aChoice] || !isChoiceSameAsA && !boxes[aChoice]) { bingoB++; } } // 更換選擇後A的中獎概率 double ratioA = (double) bingoA * 100 / totalTimes; // 隨機作出選擇的B的中獎概率 double ratioB = (double) bingoB * 100 / totalTimes; System.out.println("主持人幫忙排除一個山羊,參賽者A:" + ratioA + "%,參賽者B:" + ratioB + "%"); return new double[] {ratioA, ratioB};
下面是某次運行結果:
從代碼中咱們能夠明顯地看出(參考判斷B是否中獎的if語句):對參賽者B來講,並非剩下的兩扇門的中獎概率都爲1/2,而是當咱們在兩扇門中隨機選擇一扇時的總中獎概率爲1/2。也就是說,B的隨機選擇「調勻」了兩扇門的概率,實際上此時他的中獎概率爲:
1/2 * 1/3 + 1/2 * 2/3
完整代碼
http://pan.baidu.com/s/1jGyBXjg
參考資料