将我的代码更改为 运行 这个程序 "n" 次

Changing my code to run this program "n" times

我需要编写一个程序来计算如果我掷骰子 12 次,骰子上的每个数字至少出现一次的概率。提出的问题是有 6 个人,我们都决定每月掷一次骰子,持续一年。谁的号码出现谁就可以选择餐厅。每个人都会至少选择一次他们的餐厅的概率是多少?所以我写了一个程序,可以掷骰子 12 次并记录结果。如果我的随机方法中的每个数字都出来了,那就意味着每个人都有机会选择一家餐馆(成功)。如果在 12 卷中有一个数字保持为零,则意味着不是每个人都必须选择一家餐馆(失败)。当用户键入 "roll" 时,我的程序运行良好 运行s 并在用户键入 "Q" 时退出。它跟踪成功并将其除以程序 运行 的次数。我从一个非常简单的掷骰子程序开始,该程序来自 while 循环 运行s,然后从那里构建所有功能。最后,我意识到我需要我的程序 运行 如此 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()

这是 运行ning 1 次的输出示例。但是,当我多次键入 "roll" 时,它会正确递增以给我我的 (success/(运行s 的数量))

请帮我弄清楚如何 运行 这 "n" 次。我想我可能需要删除我的 while 循环,或者有没有更简单的方法可以在不改变太多的情况下完成它?

这里有几件事。首先,对于您的具体问题,您可以只修改循环,而不是检查 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 个都存在,如果存在 returns True,如果不存在 False。然后,您只需调用 run() 10000 次,对值求和(因为 Python 会将 True 视为 1),然后除以运行次数以获得概率估计。

除此之外,您可以通过避免使用全局变量和使用 lists 或 dicts 等数据结构来存储值而不是单个整数值等来改进您所拥有的,但是这完全是一个单独的讨论。