著名的三門問題,及代碼驗證


回顧問題

這個數學問題來源於一個娛樂節目。節目中有一位參與者和一位主持人,在參與者的面前有三扇關閉的門,其中兩扇門的后面是空的,剩下一扇門后是一輛法拉利跑車。

主持人知道哪一扇門后面有跑車,但參與者不知道。此時讓參與者人選一扇門,如果選擇的是后面有跑車的那扇門,跑車就作為獎勵送給參與者。

問題一直到這里都很簡單:一共有三扇門,參與者隨機做選擇,獲獎幾率肯定是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 }
View Code

運行結果:

數據結果顯而易見,不換門獲獎的比例占了約1/3,換門獲獎的比例占了2/3。

寫在最后 

三門問題真的是一個非常有意思的數學問題。在上個世紀的美國,這個問題剛剛被提出的時候,也遭到過許多人的質疑,這些質疑者中有教師,有學者,甚至有數學家。后來人們經過了許多次實驗,才逐漸達成共識。

質疑精神是值得鼓勵的,有了質疑才能讓思想進一步完善。

最后,讓我們來致敬一下 “三門問題” 的提出者,集才華和美貌於一身的天才人物 瑪麗蓮·沃斯·莎凡特。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM