簡體   English   中英

使用蒙特卡羅方法在Python 3.2中查找特定骰子輸出的特定概率

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM