三門問題很有意思,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!