[英]Using Monte Carlo method to find a specific probability of a certain dice output in Python 3.2
我正處於統計課程中,我們不斷受到各種約束的“骰子問題”。 這是一個概率問題,我需要使用蒙特卡羅方法來評估事件的概率。 我知道我可以通過它整合我的方式但是我想編寫一個程序,允許我簡單地修改約束,包括我有多少骰子,我制作了多少卷以及這些骰子有多少方面。
這是我正在研究的問題之一。 更簡單,因為我不想忘記我的代碼寫“能力”。
假設骰子各有9個邊。 估計滾動5個骰子時至少3個骰子具有相同值的概率。
這是我們給出的問題的一般模板:滾動X個n面骰子,每個骰子的邊數從1到n。 估計我們獲得3個或更多骰子的概率相同。
我想為樣本問題編寫一個函數,比方說,它將整數n作為輸入,這是每個骰子中的面數,並計算3個或更多骰子具有相同值的概率。 我最大的問題是約束“至少3/5”。 我已經查看了Stackoverflow上的其他類似問題,但它們都沒有真正觸及我的基礎。 你會如何編寫約束代碼? 我使用的是Python 3.2。
class Die(object):
def __init__(self, sides = 9):
self.sides = sides
def roll(self):
return randint(1, self.sides)
我被困在這里 任何輸入都有幫助,謝謝!
我不認為我會在這里上課。 你只需要生成骰子卷,然后檢查是否應該計算骰子卷。 在這種情況下,我會使用Counter
進行計數,以使代碼更加干凈:
from collections import Counter
from random import randint
def roll(ndice,nsides=9):
return [randint(1,nsides) for _ in range(ndice)]
def count_it():
c = Counter(roll(5))
return c.most_common(1)[0][1] >= 3
ntries = 100000
print (sum(1 for _ in range(ntries) if count_it())/ntries)
在我看來,你有大約10%的幾率。 Monte-Carlo的訣竅在於確定你是否融合。 您可以使用不同數量的ntries
執行此操作幾次。 你的化妝越大ntries
,較小的價差將在您的輸出。 最終,當差價足夠小時,你說你已經確定地收斂了解決方案。
只需使用你的Die類很多次:
# roll a lot of dice!
myDie = Die(9) # 9 sides
roll_counts = {side:0 for side in range(1, myDie.sides + 1)}
numRolls = int(1e6)
for x in xrange(numRolls):
roll_counts[myDie.roll()] += 1
然后根據需要分析您的分布:
for side in sorted(roll_counts):
side_pct = float(roll_counts[side]) / numRolls * 100
print 'side {} comprised {}% of all rolls'.format(side, side_pct)
編輯:我知道這個解決方案並不能解決您的作業問題,但希望它能為您提供擲骰子和計數骰子所需的工具。 您可能需要一次為多個模具執行上述操作,並且可以比較每個模具的相等性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.