模拟掷骰子游戏1000次

时间:2015-11-05 23:32:12

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

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

掷骰子

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

1 个答案:

答案 0 :(得分:2)

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

如果newDice第一次登陆7firstRoll,则会在不遇到return语句的情况下从函数末尾删除,函数返回{{ 1}}默认情况下。

由于None语句结束了该函数(停止了函数可能正在执行的任何循环并跳过函数的剩余代码),你可以通过使循环为return而不是初始化来解决这个问题。循环前while True

newDice

或者,你可以将while True: newDice = quietRoll() if newDice == firstRoll: return 1 if newDice == 7: return 0 个检查移出循环,这样一旦骰子落在if7上就会发生,无论是在内部还是外部发生循环:

firstRoll