回顧問題
這個數學問題來源於一個娛樂節目。節目中有一位參與者和一位主持人,在參與者的面前有三扇關閉的門,其中兩扇門的后面是空的,剩下一扇門后是一輛法拉利跑車。
主持人知道哪一扇門后面有跑車,但參與者不知道。此時讓參與者人選一扇門,如果選擇的是后面有跑車的那扇門,跑車就作為獎勵送給參與者。
問題一直到這里都很簡單:一共有三扇門,參與者隨機做選擇,獲獎幾率肯定是1/3。
下面是問題的重點,當參與者進行選擇以后,暫時先不打開這扇門,接下來主持人把剩下兩扇門當中的一扇打開,是空門。
此時主持人給了參與者重新選擇的機會:可以堅持剛才選擇的門(在圖中是2號門),也可以換另一扇沒有打開的門(在圖中是1號門)。
如果你是游戲參與者,你怎樣選擇的獲獎率更大?獲獎率又是多少?
匪夷所思的答案
剛剛看到這個問題的,也頗不以為然:
這種題還用問嗎?有三扇門的時候,獲獎率是1/3;現在排除了一扇門,剩下兩個門二選一,換門或不換門,獲獎率應該都是50%才對呀?
但是,正確答案是十分 “反直覺” 的:
換門的獲獎率是 2/3
不換門的獲獎率是 1/3
What's the hell?這簡直是匪夷所思啊!
“當最后剩下兩扇門的時候,此時討論的獲獎率應該是一個獨立事件,和之前參與者怎么選擇,以及主持人打開空門這些事,應該完全無關才對呀?既然是一個獨立事件,那么二選一,難道獲獎率不是50%嗎?”
首先需要明確一點,我們討論的關於“換門”的獲獎率不是一個獨立事件,必須以第一次的選擇作為基礎。在概率學當中,這種情況叫做條件概率。
那么,到底什么樣才是獨立事件呢?
舉個例子,假如游戲的參與者本來是小灰,當小灰選擇一扇門,而主持人打開一扇空門之后,不明真相的小紅從外面跑了進來。小紅並不知道當初小灰選擇的是哪一扇門,只知道剩下兩扇關閉的門中,有一扇門藏有獎勵。
那么此時對於小紅來說,無論選擇哪一扇門,獲獎率都是50%,因為小紅是在做獨立的選擇,而不是基於第一次的選擇來”換門”。
這才是所謂的 “獨立事件”。
從多個角度來思考
那么,在“換門”的情況下,獲獎率2/3又是怎么來的呢?
小灰上周的漫畫里,利用了基於“貝葉斯理論”的思想來分析換與不換的獲獎率:
直白地講,就是把第一次選擇和第二次選擇的所有情況進行細化,分析出每一種情況下的條件概率,再把這些概率進行加總,得到了最終的結果:
不換門的獲獎率 = (1/3 X 100%)+(1/3 X 0%)+(1/3 X 0%)=1/3
換門的獲獎率 = (1/3 X 0%)+(1/3 X 100%)+(1/3 X 100%)=2/3
用代碼來驗證
上面所說的都僅僅是理論分析,我們不妨用代碼來實際檢驗一下。

1 package test; 2 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 import java.util.List; 6 import java.util.Random; 7 8 /** 9 * @author zsh 10 * @site qqzsh.top 11 * @create 2019-08-02 9:28 12 * @description 三門問題 13 * 這個數學問題來源於一個娛樂節目。節目中有一位參與者和一位主持人,在參與者的面前有三扇關閉的門,其中兩扇門的后面是空的,剩下一扇門后是一輛法拉利跑車。 14 * 主持人知道哪一扇門后面有跑車,但參與者不知道。此時讓參與者人選一扇門,如果選擇的是后面有跑車的那扇門,跑車就作為獎勵送給參與者。 15 * 下面是問題的重點,當參與者進行選擇以后,暫時先不打開這扇門,接下來主持人把剩下兩扇門當中的一扇打開,是空門。 16 * 此時主持人給了參與者重新選擇的機會:可以堅持剛才選擇的門(在圖中是2號門),也可以換另一扇沒有打開的門(在圖中是1號門)。 17 * 如果你是游戲參與者,你怎樣選擇的獲獎率更大?獲獎率又是多少? 18 */ 19 public class threeDoorsTest { 20 public static void main(String[] args) { 21 //換門的獲獎總次數 22 int changeWinCount = 0; 23 //不換門的獲獎總次數 24 int unChangeWinCount = 0; 25 Random random = new Random(); 26 for (int i = 0; i < 100000; i++) { 27 List<Integer> doors = new ArrayList<>(Arrays.asList(0,1,2)); 28 int bonusDoor = random.nextInt(3); 29 int selectedDoor = random.nextInt(3); 30 //主持人打開一扇空門 31 for (int j = 0; j < doors.size(); j++) { 32 if (doors.get(j) != selectedDoor && doors.get(j) != bonusDoor){ 33 doors.remove(j); 34 break; 35 } 36 } 37 //獲得換門的序號,此時集合中就剩兩個元素 38 int changedDoor = doors.get(0); 39 if (changedDoor == selectedDoor){ 40 changedDoor = doors.get(1); 41 } 42 //如果不換門有獎,unChangeWinCount加1;如果換門有獎,changeWinCount加1 43 if (selectedDoor == bonusDoor){ 44 unChangeWinCount++; 45 }else if (changedDoor == bonusDoor){ 46 changeWinCount++; 47 } 48 } 49 System.out.println("不換門獲獎總次數:"+unChangeWinCount+",所占比例:"+(float)unChangeWinCount/100000); 50 System.out.println("換門獲獎總次數:"+changeWinCount+",所占比例:"+(float)changeWinCount/100000); 51 } 52 }
運行結果:
數據結果顯而易見,不換門獲獎的比例占了約1/3,換門獲獎的比例占了2/3。
寫在最后
三門問題真的是一個非常有意思的數學問題。在上個世紀的美國,這個問題剛剛被提出的時候,也遭到過許多人的質疑,這些質疑者中有教師,有學者,甚至有數學家。后來人們經過了許多次實驗,才逐漸達成共識。
質疑精神是值得鼓勵的,有了質疑才能讓思想進一步完善。
最后,讓我們來致敬一下 “三門問題” 的提出者,集才華和美貌於一身的天才人物 瑪麗蓮·沃斯·莎凡特。