1. 程式人生 > 實用技巧 >汽車山羊問題的分析以及Python和MATLAB模擬實驗

汽車山羊問題的分析以及Python和MATLAB模擬實驗

汽車和山羊問題

題目的背景介紹:

現有三扇門,其中一扇門後是一輛車,另外兩扇門後是一頭山羊。

選手從1,2,3號三扇門中選出一扇(僅標記,不開啟),接著主持人再從未標記的兩扇門中選出一扇開啟。

主持人知道每扇門後放的是什麼,所以每次主持人都選擇後面是羊的那扇門開啟。

選手有一次改變自己選擇的機會。

最後,開啟選手最終選中的那扇門,以選手最終選擇的是車為獲勝。

請問選手是否需要改變選擇?

汽車和山羊問題求解

一、對該問題的列舉分析

是否更換 選擇幾號門 如果車在一號門後 如果車在二號門後 如果車在三號門後
# 不換 一號 \(√\) \(×\) \(×\)
二號 \(×\) \(√\)
\(×\)
三號 \(×\) \(×\) \(√\)
# 換 一號 \(×\) \(√\) \(√\)
二號 \(√\) \(×\) \(√\)
三號 \(√\) \(√\) \(×\)

​ 令更換選擇且成功為事件A,不更換選擇且成功為事件B,那麼顯然我們可以得出二者的概率為:

\[P(A)=\frac{1}{3}\quad\quad\quad P(B)=\frac{2}{3} \]

二、對該問題的條件概率概率分析

​ 令更換選擇為事件A,不更換選擇為事件B,顯然

\[P(A)=P(B)=\frac{1}{2} \]

1. 如果沒有更換選擇

​ 車在一、二、三號門後分別為事件a、b、c,則

\[P(a)=P(b)=P(c)=\frac{1}{3} \]

​ 令選擇一、二、三號門分別為事件1,2,3,則

\[P(1)=P(2)=P(3)=\frac{1}{3} \]

​ 那麼顯然沒有更換選擇且成功的概率設為\(P(\alpha)\)就是

\[P(\alpha)=P(1\cap a)+P(2\cap b)+P(3\cap c)=1/9+1/9+1/9=1/3 \]

​ 故\(P(\alpha)=1/3\)

2. 如果更換了選擇

​ 顯然我們可知如果更換選擇,那麼如果剛開始選的是對的則最後是錯的,剛開始選的是錯的則最後是對的

​ 車在一、二、三號門後分別仍設為事件a、b、c,則

\[P(a)=P(b)=P(c)=\frac{1}{3} \]

​ 令選擇一、二、三號門也分別為事件1,2,3,則

\[P(1)=P(2)=P(3)=\frac{1}{3} \]

​ 那麼顯然更換選擇且成功的概率設為\(P(\beta)\)就是

\[P(\beta)=P(2\cap a)+P(3\cap a)+P(1\cap b)+P(3\cap b)+P(1\cap c)+P(2\cap c)\\ =1/9+1/9+1/9+1/9+1/9+1/9=2/3 \]

​ 故\(P(\beta)=2/3\)

三、基於\(MATLAB\)的模擬實驗

先用\(Python\)做了模擬實驗

from random import*
TIMES = 10000
nochange=0             			        #初始化不改選擇的次數
change=0           		 		#初始化更改選擇的次數
for i in range(TIMES):
	Door=randint(0,2)                       #汽車在哪個門
	guess=randint(0,2)                      #我的選擇是哪個門
	if Door==guess:                         #猜對了
		nochange+=1    			#不改選擇的次數+1
	else:
		change+=1   			#更改選擇的次數+1
print("不改選擇:{}".format(nochange/TIMES))
print("更改選擇:{}".format(change/TIMES))
# 以下為測試資料
# 不改選擇:0.332  更改選擇:0.668
# 不改選擇:0.3283 更改選擇:0.6717
# 不改選擇:0.331  更改選擇:0.669
# 不改選擇:0.3308 更改選擇:0.6692
# 不改選擇:0.3369 更改選擇:0.6631

可以看到模擬實驗的頻率都穩定在上述分析得出的理論概率附近

另用\(MATLAB\)也做了模擬

n = 100000;						%%n代表隨機次數
nochange = 0;					        %%不改變選擇
change = 0;						%%改變選擇
for i= 1 : n					        %%車在哪個門後
    x = randi([1,3],1);
	y = randi([1,3],1);			        %%我的選擇哪個門
if x == y						%%選對了
      nochange = nochange + 1;	%%不改選擇的次數+1
end 	
if x ~= y 						%%選錯了
    change = change + 1;		                %%更改選擇的次數+1
end
end
disp(nochange/n);				        %%輸出不改變選擇時的獲獎概率
disp(change/n);					        %%輸出改變選擇時的獲獎概率 
%%以下為測試資料
%%不改變0.3342 改變0.6658
%%不改變0.3286 改變0.6714
%%不改變0.3351 改變0.6649