【问题标题】:Simulating a game of craps 1000 times模拟掷骰子游戏 1000 次
【发布时间】:2016-02-07 00:16:20
【问题描述】:

我在 Python 中使用随机来模拟掷骰子游戏。然后我模拟游戏 n 次,以查看玩家击败庄家的频率。我有一个带有种子的测试文件来检查我的代码,但我的数字只是略有偏差。我认为错误出在结构上,但似乎无法弄清楚到底是什么。

掷骰子

def quietRoll():
    return random.randrange(1,7) + random.randrange(1,7)

掷骰子模拟

def quietCraps():

    #first roll

    firstRoll = quietRoll()
    if firstRoll in (7,11):
        return 1
    elif firstRoll in (2,3,12):
        return 0

    #every other roll

    newDice = quietRoll()
    while newDice not in (7, firstRoll):
        newDice = quietRoll()
        if newDice == firstRoll:
            return 1
        if newDice == 7:
            return 0

掷骰子 n 次

def testCraps(n):
    count = 0
    playerWin = 0
    while count <= n:
        if quietCraps() == 1:
            playerWin += 1
            count += 1
        else:
            count += 1
return playerWin/n

预期输出

Failed example:

random.seed(5)
testCraps(1000)

Expected:
    0.497
Got:
    0.414

【问题讨论】:

  • 你的问题是……什么?
  • @DavidSchwartz 是什么导致预期输出与实际不同?
  • 您是如何得出预期输出的?
  • @DeliriousMistakes 在测试文件中提供给我
  • 玩家在掷骰子中获胜的概率比 0.497 更接近 0.493。

标签: python python-3.x random while-loop


【解决方案1】:
newDice = quietRoll()
while newDice not in (7, firstRoll):
    newDice = quietRoll()
    if newDice == firstRoll:
        return 1
    if newDice == 7:
        return 0

如果newDice 第一次落在7firstRoll 上,你会在没有遇到return 语句的情况下脱离函数的末尾,并且函数默认返回None

由于 return 语句结束函数(停止函数可能正在执行的任何循环并跳过函数的任何剩余代码),您可以通过将循环设置为 while True 而之前不初始化 newDice 来解决此问题循环:

while True:
    newDice = quietRoll()
    if newDice == firstRoll:
        return 1
    if newDice == 7:
        return 0

或者,您可以将if 检查移出循环,这样它们就会在骰子落在7firstRoll 时发生,无论是在循环内部还是外部发生:

newDice = quietRoll()
while newDice not in (7, firstRoll):
    newDice = quietRoll()
if newDice == firstRoll:
    return 1
if newDice == 7:
    return 0

【讨论】:

  • 有什么替代方法来编写它,以免发生这种情况,我是初学者,所以我为这个愚蠢的问题道歉。
  • @23k:答案已扩展。
猜你喜欢
  • 1970-01-01
  • 2011-01-19
  • 2018-10-19
  • 2013-03-07
  • 2015-12-24
  • 1970-01-01
  • 2012-02-29
相关资源
最近更新 更多