三門問題很有意思,wiki用不同方法將原理講的很透徹了,我跟喜歡其中這種理解方式:無論參賽者開始的選擇如何,在被主持人問到是否更換時都選擇更換。如果參賽者先選中山羊,換之后百分之百贏;如果參賽者先選中汽車,換之后百分之百輸。而選中山羊的概率是2/3,選中汽車的概率是1/3。所以不管怎樣都換,相對最初的贏得汽車僅為1/3的機率來說,轉換選擇可以增加贏的機會。
原理明白了,實現就比較簡單了,這次用python啦。
import random as rnd
strategy = ['stick','choose','swith']
def MC(strategy,times):
wins = 0
for trail in range(times):
# 假定,實際上獎品在0號門...但是我們並不知道...
envelops = [0,1,2]
# 第一次隨機選取一扇門
first_choice = rnd.choice(envelops)
# 根據第一次的選擇情況的不同,第二次宣策面臨兩種不同的備選組合
# 如果第一次選擇了0號門,那么在打開另外兩個門中的一個空門后
# 第二次將要在0號門和未打開的空門(1 or 2)中作出選擇
if first_choice == 0:
envelops = [0,rnd.choice([1,2])]
# 如果第一次沒有選中0,那么此時被打開的必然是另一個空門,那么
# 在第二次選擇時,將在0和自己現在所處的門(first_choice)作出選擇
else:
envelops = [0,first_choice]
# 采取不同的策略進行第二次選擇
# 保持原來位置不變
if strategy == 'stick':
second_choice = first_choice
# 在除去一個空門后的兩個門中,隨機選擇一個
elif strategy == 'choose':
second_choice = rnd.choice(envelops)
# 排除一扇空門后,放棄原來的選擇,直接選擇另一扇門
elif strategy == 'switch':
envelops.remove(first_choice)
second_choice = envelops[0]
# 記得,獎品在0號門
if second_choice == 0:
wins += 1
# 計算獲獎的概率值
p = wins/times
print('第二次選擇采用'+strategy+'方法,獲獎的概率為:'+str(p)+'(模擬次數為'+str(times)+')')
MC('stick',10000)
MC('choose',10000)
MC('switch',10000)
輸出如下:

Wonderful!
