Python 2.7 模拟多个抛硬币条纹

Python 2.7 模拟多个抛硬币条纹,python-2.7,Python 2.7,首先,我想为我的英语不好道歉。这肯定无助于描述我需要解决的问题。。。我们还是试试吧 我需要模拟一个抛硬币序列,并监控我必须做多少次尝试才能获得一条预定长度的正面(或反面)。 换句话说,我需要数一数我需要多少抛硬币才能有一个连续的3个头。一旦脚本完成该连胜,它应该对4连胜和5连胜执行相同的操作 我尝试过这样的东西: def main(): import random attemps = [4,5,6] # lenght of the streaks we want to acheive for

首先,我想为我的英语不好道歉。这肯定无助于描述我需要解决的问题。。。我们还是试试吧

我需要模拟一个抛硬币序列,并监控我必须做多少次尝试才能获得一条预定长度的正面(或反面)。 换句话说,我需要数一数我需要多少抛硬币才能有一个连续的3个头。一旦脚本完成该连胜,它应该对4连胜和5连胜执行相同的操作

我尝试过这样的东西:

def main():
import random
attemps = [4,5,6]  # lenght of the streaks we want to acheive
for item in attemps:
    mylist = list(xrange(item))
    while True:
        for i in mylist:
            y = random.randint(0,1) # 0 as head, 1 as tail
            print i,y
            if y != 0:
                return False
但它当然不是我想要的。它有两个问题:

1) 一旦硬币值为1,它就会退出,但只要条纹完成,它就不会重试

2) 它只测试“调度”列表的第一个数字,即4

我真的不知道怎么解决这个问题


谢谢

不要使用将从函数返回的“return False”,而是尝试break-这将退出当前循环迭代

if y != 0:
     break

我重写了你的函数

import random
def main(n):
    """ Returns number of flips needed 
    to get n heads in a row """
    mylist = ['heads','tails']
    cnt = 0
    while 1:
        if [random.choice(mylist) for _ in range(n)].count('heads') == n:
            return cnt
        else:
            cnt +=1
那你就可以了

>>> for i in range(4,7):
...     main(i)
... 
12
18
29 # All values are completely random, this just happens to be what I got.

顺便说一句,你的英语很棒:)。

谢谢!通过这种方式,它确实会按照我的要求重试,但我可以从输出中看到,一旦它连续完成四个“0”,它将继续与列表attemps=[4,5,6]的第一个值循环。知道它如何以该值停止并切换到下一个值(即5)吗。再次感谢!