工程師 M 發明了一種游戲:M 將一個小球隨機放入完全相同的三個盒子中的某一個,玩家選中裝有球的盒子即獲勝;開始時 M 會讓玩家選擇一個盒子(選擇任何一個獲勝概率均為 1/3 );玩家做出選擇後,M 會打開沒有被選擇的兩個盒子中的一個空盒,此時 M 會詢問玩家是否更改選擇(可以堅持第一次選擇,也可以選擇另一個沒有打開的盒子),下列敘述正確的有()。
A. 改選後,玩家獲勝的概率還是 1/3
B. 若不改選,玩家的獲勝概率是 1/2
C. 無論怎麼選擇,獲勝的概率都是 1/2
D. 堅持原來的選擇獲勝概率更高
E. 選擇另一個沒有被打開的盒子獲勝概率更高
F. 獲勝概率取決於隨機因素(如小球的實際位置)
一開始看到這個題的時候,本人毫不猶豫的選擇了 A ,然後再仔細想了一下,不對啊,這題跟經典的三門問題很像,而且也要知道玩家第一次選擇和是否更改選擇的兩個事件不是相互獨立的,因此答案不是這個了,具體答案是什麼呢?也歡迎讀者留言寫下自己的見解。
再說答案之前,先來了解一下經典的三門問題:
三門問題( Monty Hall problem )亦稱為蒙提霍爾問題、蒙特霍問題或蒙提霍爾悖論,大致出自美國的電視游戲節目 Let’s Make a Deal 。問題名字來自該節目的主持人蒙提·霍爾( Monty Hall )。參賽者會看見三扇關閉了的門,其中一扇的後面有一輛汽車,選中後面有車的那扇門可贏得該汽車,另外兩扇門後面則各藏有一只山羊。當參賽者選定了一扇門,但未去開啟它的時候,節目主持人開啟剩下兩扇門的其中一扇,露出其中一只山羊。主持人其後會問參賽者要不要換另一扇仍然關上的門。問題是:換另一扇門會否增加參賽者贏得汽車的機率?如果嚴格按照上述的條件,即主持人清楚地知道,哪扇門後是羊,那麼答案是會。不換門的話,贏得汽車的幾率是1/3。換門的話,贏得汽車的幾率是2/3。
這個問題亦被叫做蒙提霍爾悖論:雖然該問題的答案在邏輯上並不自相矛盾,但十分違反直覺。這問題曾引起一陣熱烈的討論。
三門問題一共有三種可能性:
(1)參賽者挑山羊一號,主持人挑山羊二號。轉換將贏得汽車。
(2)參賽者挑山羊二號,主持人挑山羊一號。轉換將贏得汽車。
(3)參賽者挑汽車,主持人挑羊一號。轉換將失敗和參賽者挑汽車,主持人挑羊二號。轉換將失敗,不會贏得汽車。
這裡要注意了,第三種可能性的時候,概率還是 1/3 ,因為 1/3*1/2+1/3*1/2=1/3 ,所以上面的三種可能性都是相等的,都是 1/3 。從上面對的三種情況可以看到,如果參賽者重新選擇另一扇門的話, 得到汽車的概率就會變成 2/3 ,所以重新選擇會更加的有利。一開始這個解釋都不會讓人信服的,因為此時我們還在糾結的是一開始分配的概率是1/3,然後去除了一個沒有汽車的門後,兩個選擇,所以概率就是 1/2 ,還有一種糾結就是無論我們怎麼選,三種情況,每次選擇的概率都是 1/3 啊,當然,第二種選擇很容易就給推翻了,因為主持人明確的去除了一個不會得到汽車的門,因此概率不會是 1/3 的。一開始我也在糾結這個,查了一下,就經典的解釋就是把門的數量增多,比如:
現在擺在我們面前的有100扇門,只有其中一扇門後是汽車,而其他的99扇門後都是山羊。好了,你選擇其中一扇門。自然,你選取汽車的概率只有1/100。
然後,知道汽車存放處的主持人一口氣打開了99扇門中的98扇,其後面都是山羊。此時你可以堅持最初的選擇,也可以改變選擇。你是否應當改變選擇?你是否還認為在你最初選擇的門與其他99扇門中唯一沒有打開的那扇門背後有汽車的概率是相同的?
事實是,如果你拒絕改變,你只有在一開始就選擇了正確的門的情況下才能獲取汽車,這個概率只有1%。在另外99%的情況下,你最初選擇的是一個後面是山羊的門,而另外的98扇已經打開,你這時改變最初的選擇就可以成功。所以,在99%的概率下,改變選擇是正確的。
三門問題是一個理性選擇和機遇博弈問題,是關於不完全信息博弈中如何正確理解概率的含義和概率變化的問題。可見這個問題我們仔細琢磨一下,還是可以做出正確的選擇的。
顯然這個還是不能太讓人接受,因此寫個 Java 程序來模擬一下這個場景:
package com.liangdianshui;
import java.util.Random;
public class MontyHallProblem {
public static void main(String[] args) {
// 重復五次
for (int i = 0; i < 4; i++) {
montyHallProblem();
System.out.println("----------------------------------");
}
}
public static void montyHallProblem() {
Random random = new Random(); // 這裡不討論Random為偽隨機的問題
int changeCount = 0;
for (int i = 0; i < 1000000.0f; i++) { // 模擬一百萬次
// 假設有三個門
int[] doors = new int[3];
// 隨機抽取一扇門 ,在門後放獎品
int rIndex = random.nextInt(3);
doors[rIndex] = 1;
// 觀眾選的門號
int randomSelect = random.nextInt(3);
// 主持人從剩下的兩扇門中排除一個
while (true) {
int randomDelete = random.nextInt(3);
// 主持人不會打開參賽者已經選了的門(排除參賽者選擇的門)
if (randomDelete == randomSelect) {
continue;
}
// 主持人不會打開有獎品的門(排除有獎品的門)
if (doors[randomDelete] == 1) {
continue;
}
for (int j = 0; j < 3; j++)// 換門
{
if (j == randomSelect)// 不換門(因為我們要得到的是換門的概率,因此把不換門的排除掉)
continue;
// 排除主持人打開了那個門(因為門已經打開,所以不能換,排除掉)
if (j == randomDelete)
continue;
if (doors[j] == 1) {
changeCount++;// 換了門後中獎的次數
break;
}
}
break;
}
}
System.out.println("換門中獎率:" + changeCount / 1000000.0f);
}
}
最後運行的結果:
根據結果可見,這裡重復了四次,每次都模擬了一百萬次的選擇換門的情況,發現換門中獎的概念都是 0.66 左右,也就是 2/3 。
可見我們這個面試題跟三門問題基本一樣,所以最終選擇的答案是E,也就是選擇另一個沒有被打開的盒子獲勝概率更高。因為本人也沒有官方的答案,如果有異議的話,可以進行留言。或者有錯的地方,也可進行留言指出,本人會第一時間進行更改。