【Python練習】實現蒙提霍爾問題
(Picture from wiki)
目標:
使用Python代碼來解答蒙提霍爾問題
步驟:
1.拆解蒙提霍爾問題
2.代碼如何實現
3.圖表及結論
1.拆解蒙提霍爾問題
1.1概述
蒙提霍爾是個十分反直覺的問題(更詳細可參考維基百科:蒙提霍爾問題),情況如下:
有三扇門後面有兩支山羊一台車,在選擇一扇門以後,另外兩扇門其中一扇們被打開裡頭是一支山羊,這時候有一次的機會選擇:
*要換門
*還是堅持不換門
問題是換門or不換門哪個方式選中車子的機率比較高呢?
1.2 先設定變數
假設我們是來賓(guest),然後會有第一次選擇門的機會,然後會有一個主持人(host)在我們選擇門以後幫我們打開另外兩扇門的其中一扇,並且在主持人開門後我們可以再選擇要換門或者不要換門。有了這個故事情節,就可以先有五個變數:
*guest_first:來賓第一次選擇門
*host_open:主持人開另外兩扇門其中一扇
*guest_second:來賓選擇要不要換門
*change: 換門
*not_change: 不換門
1.3整理一下三觀
*[注1] 多次重複實驗過程,可以使用迴圈(for loop)
*[注2] 主持人開門(host_open)的結果必須是山羊而不是車子(如果主持人開門後結果是車子遊戲就沒意義)
*[注3] 以上帝視角:如果來賓第一次(guest_first)選到車子,最好的策略就是不要換門(not_change)
*[注4] 以上帝視角:如果來賓第一次(guest first)選到山羊,主持人開門後是另外一支山羊,最好的策略就是換門(change)
2.代碼如何實現
import random as random
import matplotlib.pyplot as plt
%matplotlib inline
random.seed(0)
change = 0
not_change = 0
times = 100000 # 計算10萬次
# [注1]多次重複實驗過程,可以使用迴圈(for loop)
for i in range(times):
# 先創造兩支山羊跟一台車子的門
doors = ['goat_1', 'goat_2', 'car']
random.shuffle(doors)
# 來賓第一次選擇門
guest_first = random.choice(doors)
# 主持人開另外兩扇門其中一扇
# [注2]主持人開門(host_open)的結果必須是山羊而不是車子(如果主持然開門後結果是車子遊戲就沒意義)
if guest_first == 'goat_1':
host_open = 'goat_2'
elif guest_first == 'goat_2':
host_open = 'goat_1'
# [注3]以上帝視角來看:來賓第一次(guest_first)就選到車子最好的策略就是不要換門
elif guest_first == 'car':
not_change += 1
# [注4] 以上帝視角來看:來賓第一次需選到山羊,主持人開門後是另外一支山羊,最好的策略就是換門
guest_second = doors
doors.remove(host_open)
doors.remove(guest_first)
if guest_second == ['car']:
change += 1
print(f'Get car with not change: {(not_change/times)*100}%')
print(f'Get car with change:{(change/times)*100}%')
3.圖表及結論
執行100,000次的結論就是如果第二次選擇換門,猜中車子的機率就比較高。
Get car with change: 66.606%
Get car with not_change:33.394%
3.1 個人觀點
蒙提霍爾是一反直覺的陷阱題,且是一個很有趣且用基礎的機率公式就能解釋的問題。這位作者倒是提供一個圖文並茂的解法(link)。所以個人小結如下:
蒙提霍爾問題是要滿足有兩個必要條件才成立:
*必須要人人有獎
*選項中的期望效用只有最好跟次好,此兩種效用
結論1:
所以根據必須人人都有獎的條件,公司抽獎僧多粥少的情境是不適用蒙提霍爾問題。
結論2:
所以根據期望效用只有最好跟次好兩種效用,如果三人抽取1、2、3獎的方式也無法套用在蒙提霍爾問題
但最後:
假如有一天你、小明、小美被公司選為最佳業務三巨頭,然後老闆決定給出三份獎金用抽籤的方式送出去,
*獎金分別為5萬、5萬、10萬
*然後小美先抽到了5萬,
這時候你會願意跟小明交換手上的籤嗎? To change or not to change ?
留言
張貼留言