Python:蒙特卡羅方法模擬解決三門問題

蒙特卡羅方法與三門問題

蒙特·卡羅方法(Monte Carlo method),也稱統計模擬方法。是一種統計學的方法、模擬方法,通過大量隨機樣本模擬問題,從而獲得所要計算的值。

三門問題:

三門問題(Monty Hall problem)亦稱爲蒙提霍爾問題、蒙特霍問題或蒙提霍爾悖論,大致出自美國的電視遊戲節目Let's Make a Deal。問題名字來自該節目的主持人蒙提·霍爾(Monty Hall)。參賽者會看見三扇關閉了的門,其中一扇的後面有一輛汽車,選中後面有車的那扇門可贏得該汽車,另外兩扇門後面則各藏有一隻山羊。當參賽者選定了一扇門,但未去開啓它的時候,節目主持人開啓剩下兩扇門的其中一扇,露出其中一隻山羊。主持人其後會問參賽者要不要換另一扇仍然關上的門。問題是:換另一扇門會否增加參賽者贏得汽車的機率?如果嚴格按照上述的條件,即主持人清楚地知道,自己打開的那扇門後是羊,那麼答案是會。不換門的話,贏得汽車的機率是1/3。換門的話,贏得汽車的機率是2/3。

蒙特卡洛思想在三門問題上的應用

應用蒙特卡洛重點在使用隨機數來模擬類似於賭博問題的贏率問題,並且通過多次模擬得到所要計算值的模擬值。在三門問題中,用0、1、2分別代表三扇門的編號,在[0,2]之間隨機生成一個整數代表獎品所在門的編號prize,再次在[0,2]之間隨機生成一個整數代表參賽者所選擇的門的編號guess。用變量change代表遊戲中的換門(ture)與不換門(false):

 這樣大量重複模擬這個過程(10000次或者100000次)就可以得到換門猜中的概率和不換門猜中的概率。

使用python(python對縮進有要求,要特別注意),編程實現:

# -*- coding: utf-8 -*-
import random


#玩遊戲,change:是否換門
def play(change):
    #獎品爲[0,2]之間的一個隨機整數
    prize=random.randint(0,2)
    #在[0,2]之間生成一個隨機整數作爲參賽者猜的門的編號
    guess=random.randint(0,2)
    #假設一開始猜中
    if(prize==guess):
        if(change):
            return False
        else:
            return True
    #假設一開始猜錯
    else:
        if(change):
            return True
        else:
            return False

#計算贏率,N代表模擬次數,change代表是否換門
def winRate(change,N):
    win=0
    #range範圍爲:[0,N)
    for i in range(0,N):
        if (play(change)):
            win=win+1
    print("中獎率爲:")
    print(win/N)

N=1000000
print("玩"+str(N)+"次,每一次都換門:")
winRate(True,N)
print('\n')
print("玩"+str(N)+"次,每一次都不換門:")
winRate(False,N)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章