中獎問題
遊戲中,有一種寶箱,打開這個寶箱獲得傳奇武器的概率是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左右