我需要编写一个程序,计算出如果我掷骰子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”时,它会正确递增,以显示我的(成功/(运行次数))
[请帮助我弄清楚如何运行这“ 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个字符都存在,如果是,则返回True
,否则,返回False
。然后,您可以只调用run()
10000次,对这些值求和(因为Python会将True
视为1),然后除以运行次数即可得出概率估算值。
即使如此,您也可以避免使用全局变量,而不必使用list
或dict
s之类的数据结构来存储值而不是单个整数值,从而改善您的状态,但这完全是一个单独的讨论。] >