天天看點

三門問題的了解和Java實作 三門問題的了解和 Java實作

三門問題的了解和 Java實作

三門問題(Monty Hall problem)亦稱為蒙提霍爾問題、蒙特霍問題或蒙提霍爾悖論,大緻出自美國的電視遊戲節目 Let’s Make a Deal。問題名字來自該節目的主持人蒙提·霍爾(Monty Hall)。

參賽者會看見三扇關閉的門,其中一扇門後面有一輛汽車,選中後面有車的那扇門就能赢得汽車,而另外兩扇門後面P都沒有。當參賽者標明一扇門,準備開啟的時候,節目主持人會開啟另外兩扇門的其中一扇,這扇門後面一定沒有汽車,主持人會問參賽者要不要換另一扇門。問題是:換另一扇門會不會增加參賽者獲獎的概論????

三門問題的了解和Java實作 三門問題的了解和 Java實作
三門問題的了解和Java實作 三門問題的了解和 Java實作

按一般直覺來想,主持人打開那扇門,似乎不影響參賽者的中獎機率,剩下的兩道門必定有一個有車一個無車,中獎機率是二分之一。但是,嚴謹的數學表明并不是這樣的,真正的概論應該是

換門的話,中獎的機率是 2 3 \frac{2}{3} 32​

不換門的話,中獎的機率是 1 3 \frac{1}{3} 31​

由于我們在短時間内無法用嚴謹的數學方法說明,友善起見,我們用蒙特卡羅方法來實作這個機率

蒙特·卡羅方法(Monte Carlo method),也稱統計模拟方法,是二十世紀四十年代中期由于科學技術的發展和電子計算機的發明,而被提出的一種以機率統計理論為指導的一類非常重要的數值計算方法。當所求解問題是某種随機事件出現的機率,或者是某個随機變量的期望值時,通過某種“實驗”的方法,以這種事件出現的頻率估計這一随機事件的機率,或者得到這個随機變量的某些數字特征,并将其作為問題的解。

以下為Java的代碼實作

package 三門問題;

import 作業.成員内部類.iner;

public class threeDoors{
private int N;//定義N來表示進行實驗的次數
public  threeDoors(int N)
{
	
	if(N<=0)
	{//檢測N是否小于0,若是 抛出非法參數異常
		throw new IllegalArgumentException("N必須大于0");
	}
	//儲存傳入的N
	this.N=N;
}

public void run(boolean changeDoor)
{
	
	int wins=0;//用來記錄中獎次數
	
	for(int i=0;i<N;i++)
	{
		//傳入是否換門的參數給play()方法,play()方法傳回在換門/不換門情況下的是否中獎,中獎傳回true,沒中傳回false
		if(play(changeDoor))
		{
			wins++;//若中獎,次數+1
		}
	}
		//輸出前提語句
		System.out.println(changeDoor?"換門":"不換門");
		//用中獎的次數除于總次數N得到概論
		System.out.println("中獎的概論是:"+(double)wins/N);

}
//定義一個play()方法,模拟參賽者抽獎過程
private boolean play(boolean changeDoor)
{   //1,2,3号門中随機一個為中獎門
	int prizeDoor=(int)(Math.random()*3);
	//1,2,3号門中玩家随機選一個門
	int playerChoice=(int)(Math.random()*3);
	
	if(prizeDoor==playerChoice)
	{
		//當玩家選的門是有車的門時,換門=輸 不換門=赢
		return changeDoor?false:true;
	}
	else {
		//當玩家選的門是無車的門時,換門=赢,不換門=輸
		return changeDoor?true:false;
	}
	
}

	public static void main(String[] args) {
		
		//設定N的大小,數值越大,實驗結果越準确,這裡設定為一百萬次
	int N=1000000;
	//建立threeDoors的對象,傳入參數N
	threeDoors s=new threeDoors(N);
	
	s.run(true);
	System.out.println();//換行
	s.run(false);
	}

}
           

運作後結果為:

換門

中獎的機率是:0.667196 (約等于2/3)

不換門

中獎的機率是:0.333385 (約等于1/3)

通過蒙特卡咯方法,進行一百萬次的抽獎模拟,我們能得出這個問題的大概結果。

但是我們可能還是不明白為什麼換門就比不換門中獎機率高呢?以下我們可以用一些簡單的數學推理來了解三門問題:

在遊戲開始的時候,1,2,3号門中獎的機率是相等的,都是1/3

P(1号門中獎)+P(2号門中獎)+P(3号門中獎)=1

當玩家選擇了1号門時,玩家中獎的機率即為1/3

P(1号門中獎)=1/3

那剩下的2,3号門的中獎機率就為2/3

P(2号門中獎)+P(3号門中獎)=2/3

此時,主持人将2号和3号門中沒有獎的2号門打開了,并确認地告訴你這個門沒有獎,則2号門中獎的機率為0,那3号門中獎的機率為2/3,即為玩家選擇的1号門的兩倍

P(2号門中獎)=0=>P(3号門中獎)=2/3

是以當玩家換3号門時中獎機率為2/3,不換門時中獎機率為1/3