繁体   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