【发布时间】:2017-11-08 03:03:37
【问题描述】:
我正在学习 MIT OpenCourseWare 计算机编程入门课程,但我不确定我是否以正确的方式解决了简单的模拟问题。
- 滚动 Yahtzee 的概率是多少!在第一卷?也就是说,什么是 掷出五个 6 面骰子并让它们都显示相同数字的概率?
- 编写蒙特卡罗模拟来解决上述问题(Yahtzee 问题),然后 提交您的代码
所以滚动 Yahtzee 的概率是 1/1296 或大约 0.077%
这是我运行模拟的代码:
import random
def runYahtzee(numTrials):
"""Runs the classes version of the yahtzee simulation"""
success = 0
for i in range(numTrials):
dices = []
for i in range(6):
dices.append(random.randrange(1,7))
#print dices
state = True
for dice in dices:
if dice != dices[0]:
state = False
if state == True:
print "You got a Yahtzee"
print dices
success += 1
print "numTrials is: " + str(numTrials)
print "Success is: " + str(success)
rate = float(success)/numTrials
return rate
runYahtzee(10000000)
多次运行该程序,我每次都得到大约 .0001258。这是 0.012%,但实际概率约为 0.077%。我在这里做错了什么吗?
【问题讨论】:
-
出于好奇,我做了一些研究,看看您确定一组骰子是否为 yahtzee 的方法是否可以改进,结果出奇的好!我预计
len(set(dice)) == 1会更好,但这比它高出 2 倍。我还预计functools.reduce(operator.eq, dice)会更好,但这也将其排除在外。 -
@AdamSmith
d0 = randrange(1,7); all(d0 == randrange(1,7) for _ in range(4))怎么样? (完全跳过骰子的创建)。 OP 的原始版本没有优化:一旦确定state为 False,您就可以跳出循环。 -
len(set(dice)) == 1对我来说是最快的(Py3),但random.choices(range(1, 7), k=5)也比5 * random.randrange(1, 7)快。
标签: python python-2.7 simulation montecarlo