更改我的代码以运行该程序n次

问题描述 投票:-2回答:1

我需要编写一个程序,计算出如果我掷骰子12次,骰子上的每个数字至少出现一次的可能性。提出的问题是有6个人,我们所有人都决定一年一次每月一次死一次。谁的人数多了就可以去餐厅。每个人至少会选择一次餐厅的可能性是多少?因此,我编写了一个程序,该程序将掷骰子12次并跟踪结果。如果我随机方法中的每个数字都出来了,那意味着每个人都有机会选择一家餐厅(成功)。如果其中一个数字在12个滚动组中保持为零,则意味着并非每个人都必须选择一家餐厅(失败)。当用户键入“ roll”时,我的程序运行良好,并且运行;如果用户键入“ Q”,则退出。它跟踪成功并将其除以程序运行的次数。我从一个非常简单的冲模程序开始,该程序从while循环运行,然后从那里构建所有功能。最后,我意识到我需要让程序运行100或1000次才能找到一个好的概率平均值。我并不是最好的编码器,我想您可以从我的代码中看到,但是我将自己编码为一个角落,并希望能够运行“ n”次而无需花费很多时间来弄清楚这一点。我敢肯定,这里的优秀编码人员将能够非常轻松地为我提供帮助。先感谢您。这是我的代码。

import random

global success
success = 0
global eachturn
eachturn = 0


def main():
    rolling = True
    while rolling:
        roll_again = input("Ready to roll? ENTER=Roll. Q=Quit. ")
        if roll_again.lower() != "q":
            global chance
            global result
            global n1
            global n2
            global n3
            global n4
            global n5
            global n6
            n1 = n2 = n3 = n4 = n5 = n6 = 0
            droll = 1
            result = 0
            for number in range(1, 13):
                result = random.randint(1, 6)
                print("Roll {0} = {1}".format(droll, result))
                droll += 1
                counter()
            print(
                "\n---- Stats: ----\nTimes number one appeared: {}\nTimes number two appeared: {}\n"
                "Times number three appeared: {}\nTimes number four appeared: {}\nTimes number five appeared: {}\n"
                "Times number six appeared: {}".format(
                    n1, n2, n3, n4, n5, n6))
            iszero()
            turncounter()
            print("This increments when all numbers 1-6 are part of the 12 roll outcome:")
            print(success)
            print("The amount of times the program is run (12 rolls of a dice):")
            print(eachturn)
            print("This is the success divided by the number of program runs:")
            print(success/eachturn)

        else:
            rolling = False

    print("Thanks for playing.")


def counter():
    global result
    global n1
    global n2
    global n3
    global n4
    global n5
    global n6
    if result == 1:
        n1 += 1
    elif result == 2:
        n2 += 1
    elif result == 3:
        n3 += 1
    elif result == 4:
        n4 += 1
    elif result == 5:
        n5 += 1
    elif result == 6:
        n6 += 1
    else:
        print("droll = {}".format(result))
        return None


def iszero():
    global zero
    global success
    zero = 0
    if n1 == 0:
        return zero
    elif n2 == 0:
        return 0
    elif n3 == 0:
        return 0
    elif n4 == 0:
        return 0
    elif n5 == 0:
        return 0
    elif n6 == 0:
        return 0
    else:
        zero += 1
        success += 1
        return zero


def turncounter():
    global eachturn
    eachturn += 1


main()

这里是运行1次的输出示例。但是,当我多次输入“ roll”时,它会正确递增,以显示我的(成功/(运行次数))

enter image description here

[请帮助我弄清楚如何运行这“ n”次。我想我可能需要删除while循环,或者是否有一种更简单的方法可以在不进行太多更改的情况下实现这一目标?

python probability dice
1个回答
0
投票

这里有几件事。首先,对于您的特定问题,您可以修改循环,这样就不必循环检查main()中的输入,而只需循环固定次数即可。您可以使用类似的方法:

def main():
    for round in range(1000):
        global chance
        global result
        global n1
        ...
        print("This is the success divided by the number of program runs:")
        print(success/eachturn)

就是说,对于可能只有几行的代码,这绝对是大量的代码:

In [51]: def run():
    ...:     return len({random.randint(1, 6) for _ in range(12)}) == 6
    ...:

In [52]: sum([run() for _ in range(10000)]) / 10000
Out[52]: 0.4287

run的每次调用会生成1到6之间的12个随机数,并将它们存储在set中(这将消除重复项)。然后,它检查是否所有6个字符都存在,如果是,则返回True,否则,返回False。然后,您可以只调用run() 10000次,对这些值求和(因为Python会将True视为1),然后除以运行次数即可得出概率估算值。

即使如此,您也可以避免使用全局变量,而不必使用listdict s之类的数据结构来存储值而不是单个整数值,从而改善您的状态,但这完全是一个单独的讨论。] >

© www.soinside.com 2019 - 2024. All rights reserved.