我正在尝试学习 Python,我正在编写一些脚本来获得乐趣以适应这门语言。
我正在尝试创建一个脚本,它将掷出 3 个“骰子”,如果所有 3 个都返回 6,它会将其写入列表,否则再次掷骰子并更新计数器。
所有这些都应该发生很多次,这样我就可以得到一个大列表,然后计算获得三倍 6 所需的平均掷骰数。
经过多次迭代后,这就是我现在的代码(可能不是最理想的,因为我对其进行了大量编辑以尝试找到使其工作的方法)
#!/usr/bin/python
from random import randint
first = randint(0,5)
second = randint(0,5)
third = randint(0,5)
count = 1
list = []
for_list = range(10000)
for item in for_list:
while first != 5 or second != 5 or third != 5:
count+=1
first = randint(0,5)
second = randint(0,5)
third = randint(0,5)
if first == 5 and second == 5 and third == 5:
list.append(count)
count = 1
print sum(list) / float(len(list))
print list
现在 while 循环似乎有效,但我不知道如何让它实际运行多次(for 循环,在本例中为 10,000 次)。
这是我的输出(打印“平均值”和包含计数变量的列表:
218.0
[218]
所以在这次运行中,它进行了 218 次滚动。之后脚本结束。 谁能帮我理解为什么脚本没有运行 for 循环?
谢谢!
请您参考如下方法:
您的 bool 条件在这里有问题:
first != 5 or second != 5 or third != 5
只有当所有三个值都设置为 5 时,这才是 False。当您找到一个 triple-5 集合时,您的 while 循环将始终变为False。
因此,在找到您的第一个匹配项之后,您的 first、second 和 third 变量将设置为 5,并且 while 循环永远不会进入您的 for 循环迭代的其他 9999 次。
与其在此处使用while 循环,不如使用大量迭代并在每次迭代中掷骰子,然后使用简单的if 将其添加到列表中:
results = []
counter = 0
for iteration in xrange(10 ** 6): # 1 million times
counter += 1
roll = random.randint(1, 6), random.randint(1, 6), random.randint(1, 6)
if roll == (6, 6, 6):
results.append(counter)
counter = 0
我为结果列表使用了一个更好的名称;您希望避免使用与变量的内置类型相同的名称。由于您使用的是 Python 2,我也切换到使用 xrange();仅仅为了控制循环应该重复多少次而构建一个完整的整数列表是没有意义的。
我使用一个元组来存储三个掷骰子,并从 1 到 6 中挑选数字来匹配传统的骰子数字。然后,您可以通过与另一个包含 3 个数字的元组进行比较来测试是否找到了匹配项。
演示:
>>> results = []
>>> counter = 0
>>> for iteration in xrange(10 ** 6): # 1 million times
... counter += 1
... roll = random.randint(1, 6), random.randint(1, 6), random.randint(1, 6)
... if roll == (6, 6, 6):
... results.append(counter)
... counter = 0
...
>>> sum(results, 0.0) / len(results)
217.40704500978472
>>> len(results)
4599
