【Java】蒙提霍尔问题的概率原理及随机化模拟
問題引入
人們常說:“相信自己的直覺”、“跟著自己的直覺走,沒錯的”、“要堅定自己的路”……
不是說這些話不對,但有時候結果還真不是我們直覺能get到的……
這是一個有趣的問題——三門問題,希望給大家一些啟發。
三門問題
三門問題(Monty Hall problem)亦稱為蒙提霍爾問題、蒙特霍問題或蒙提霍爾悖論,大致出自美國的電視游戲節目Let’s Make a Deal。問題名字來自該節目的主持人蒙提·霍爾(Monty Hall)。參賽者會看見三扇關閉了的門,其中一扇的后面有一輛汽車,選中后面有車的那扇門可贏得該汽車,另外兩扇門后面則各藏有一只山羊。當參賽者選定了一扇門,但未去開啟它的時候,節目主持人開啟剩下兩扇門的其中一扇,露出其中一只山羊。主持人其后會問參賽者要不要換另一扇仍然關上的門。問題是:換另一扇門會否增加參賽者贏得汽車的機率?如果嚴格按照上述的條件,即主持人清楚地知道,自己打開的那扇門后是羊,那么答案是會。不換門的話,贏得汽車的幾率是1/3。換門的話,贏得汽車的幾率是2/3。
這個問題亦被叫做蒙提霍爾悖論:雖然該問題的答案在邏輯上并不自相矛盾,但十分違反直覺。這問題曾引起一陣熱烈的討論。
Java模擬驗證
這次也不能說是什么編程實現了,只能說做個隨機化模擬吧,把數據量開的大一些,就1’000’000吧,問題不大。
這個模擬的思路就是我們用一個set,裝 0, 1, 2 三個數字,模擬三扇門,然后先隨機生成一下0~2之間的一個隨機數(也就是真正的汽車所在位置)。
接下來我們隨機生成一個參賽者的選擇(他沒有任何場外信息,只能三蒙一),由于我們模擬的是選手更改選擇的情況,所以這個就沒什么意義了,那就刪去它。
然后還要隨機生成一個主持人打開的門。主持人顯然是知道車在哪里的,不論被沒被參賽者第一次選中,主持人都只會打開一扇空門(也就是藏有山羊的門)。這個隨機序號不能與真正的結果重合,也不能與選手選中的序號重合(這兩種情況也可能重合)。這個序列也刪去它。
一共只有三個數,刪了兩個,就只剩一個了。我們做的模擬是選手選擇換門,所以剩下的門就是他選的答案,看一看與最初的隨機答案一不一致就行。
最后概率竟是2/3。
import java.util.HashSet; import java.util.Random; import java.util.Set;public class Main {public static void main(String[] args) {int times = 1000000;int winNum = 0;Set<Integer> set = new HashSet<>();Random random = new Random();for (int i = 0; i < times; i++) {set.add(0);set.add(1);set.add(2);//車在隨機一個門后面int result = random.nextInt(3);//從三個門里面盲猜一個門int guessNum = random.nextInt(3);//剔除選項set.remove(guessNum);int removeNum = 3;while (removeNum == result || removeNum == guessNum) {removeNum = random.nextInt(3);}//主持人再刪一個set.remove(removeNum);if (set.contains(result)) {winNum++;}}System.out.println("總游戲次數是:" + times);System.out.println("當更改選擇的時候,獲勝次數是:" + winNum);System.out.printf("更改選擇的勝率是:%.3f%%", (double)winNum/times*100);} }一則結果:
原理
不能只是知其然,更要知其所以然。
這個問題的分析還要回歸到概率論上。
容易理解的分析
先給一個不規范的分析,更好理解:
試想原先三蒙一,概率確實是1/3,但反過來考慮,不是第一次選中的概率是2/3,那在主持人幫我們排掉一個不可能情況的情況下,我們換成沒人動過的門,成功的概率是2/3,是大于我們“堅持信仰”概率的。
詳細分析
主持人其實沒啥用,所以可以不看:
第一次選的空門(概率66.6%),之后主持人開另一個空門,換門,得到汽車。
第一次選的汽車(概率33.3%),之后主持人開另一個空門,不換門,得到汽車。
這里影響到結果的概率問題只發生在第一次選門上,如果條件如上設置,當一開始的門選定后,事件的結果也就決定了,所以這里不存在之后主持人是選擇1號空門,還是2號空門的問題,所以在做概率計算是不考慮主持人的選擇。
如果也要考慮主持人的話:
第一次選的空門1(概率1/3),之后主持人開另一個空門,換門,得到汽車。事件總概率1/3。
第一次選的空門2(概率1/3),之后主持人開另一個空門,換門,得到汽車。事件總概率1/3。
第一次選的汽車(概率1/3),之后主持人開另一個空門1(概率1/2),不換門,得到汽車 這個事件總概率
。
第一次選的汽車(概率1/3),之后主持人開另一個空門2(概率1/2),不換門,得到汽車 這個事件總概率
。
主持人選1號空門還是2號空門打開,這里有個主持人的選擇概率,我假設的是主持人隨機選擇(抽簽或者隨意),所以各給了50%的概率,如果主持人就是喜歡1號空門,必開1號,那么也就成了1號(100%),2號(0%)了,最后結果并不影響。
所以開始選中汽車,最后換門不得獎的概率是33.3%,開始選中空門,換門最后得獎的概率是66.6%。
當然了,其實分析題意就知道主持人這邊與概率根本沒有關系,所以真的不必考慮他。
Ending……
類似問題(Update on 2020.2.23)
找到了一篇博客,也是類似的問題。
仔細看看就能加深理解啦!
總結
以上是生活随笔為你收集整理的【Java】蒙提霍尔问题的概率原理及随机化模拟的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 洛谷P1151、P1200、P1420、
- 下一篇: 【VB.NET】VB.NET窗体与控件问