Python:蒙特卡洛方法模擬中獎問題

中獎問題

 遊戲中,有一種寶箱,打開這個寶箱獲得傳奇武器的概率是20%,現在你打開5個這樣的寶箱,獲得傳奇武器的概率是多少?

 在該問題中我們做這樣一個轉換:

用區間[0,1)來模擬開寶箱中獎情況,則用在0-1之間均勻分佈的隨機數來表示我們開啓寶箱的標誌,如果隨機數落在[0,0.2)之間代表中獎,否則不中獎,中獎概率仍然爲20%。

用代碼實現這個模擬開寶箱的過程:

#模擬開寶箱,每次模擬開啓n個箱子,winPrizeRate代表中獎率
def play(n,winPrizeRate):
    for i in range(0,n):
        #生成一個在0到1之間均勻分佈的隨機數作爲抽獎者抽獎標誌
        guess = random.random()
        #抽獎者抽獎標誌落在抽中可能性範圍內即爲中獎
        if(guess<winPrizeRate):
            return True
    return False

 蒙特卡洛思想是使用隨機數進行大量模擬得到模擬值,現在我們打算模擬計算每次遊戲開啓5個寶箱,最終獲得傳奇武器的概率是多少?

#模擬N次,每次開啓n個箱子,winPrizeRate:每個箱子中獎可能性
def winRate(N,n,winPrizeRate):
    win = 0
    #i取值範圍爲[0,N)
    for i in range(0,N):
        if(play(n,winPrizeRate)):
            win += 1
    print("中獎概率爲:"+str(win/N)) 

 完整代碼:

# -*- coding: utf-8 -*-  

import random

#模擬N次,每次開啓n個箱子,winPrizeRate:開一次箱子中獎可能性
def winRate(N,n,winPrizeRate):
    win = 0
    #i取值範圍爲[0,N)
    for i in range(0,N):
        if(play(n,winPrizeRate)):
            win += 1
    print("中獎概率爲:"+str(win/N)) 

#模擬開寶箱,每次模擬開啓n個箱子,winPrizeRate代表中獎率
def play(n,winPrizeRate):
    for i in range(0,n):
        #生成一個在0到1之間均勻分佈的隨機數作爲抽獎者抽獎標誌
        guess = random.random()
        #抽獎者抽獎標誌落在抽中可能性範圍內即爲中獎
        if(guess<winPrizeRate):
            return True
    return False


N=1000000
n=5
winPrizeRate=0.2

winRate(N,n,winPrizeRate)

 

可以看到中獎概率穩定在0.67左右

 

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