首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么包含一个简单的while循环的for循环只运行两次?也很糟糕

为什么包含一个简单的while循环的for循环只运行两次?也很糟糕
EN

Stack Overflow用户
提问于 2019-06-03 06:37:43
回答 2查看 100关注 0票数 2

我尝试在这个while循环上循环几次,以收集有关输出正确的行序列所需时间的信息(拼写为“编码器”)。我预计我的for循环会循环十次。相反,我只得到了一次循环,然后在0秒内完成了一次故障重复。

我可以用while i < 10替换for i in (0, 10)行,然后添加一个i += 1,以获得更长的故障输出(它将把第一个结论循环到while循环n次,而不是2次)。我还尝试在for循环中移动列表和字典,但这并不能使循环正常运行。

代码语言:javascript
复制
from random import randint
from time import sleep
import datetime


stats_collection = []
correct_order = [0, 1, 2, 3, 4]  # A list of numbers between 0 and 4
output_order = []
iterations = 0
the_lines = {0: "...###.................#####...####..",
             1: "..#...#.........####...#.......#...#.",
             2: "..#.......###...#...#..##......##....",
             3: "..#...#..#...#..#...#..#.......#.#...",
             4: "...###....###...####...#####...#..#..",}

for i in (0,10):

    a_currentDT = str(datetime.datetime.now())

    while output_order[-5:] != correct_order:
        next = randint(0, 4) # Select between
        output_order.append(next)
        print(the_lines[next])
        iterations += 1
        # sleep(0.125)

    final_iterations = iterations

    b_currentDT = str(datetime.datetime.now())

    print("Finished!")
    print("Iterations: {num}".format(num=final_iterations))
    print(a_currentDT)
    print(b_currentDT)

    stats_collection.append(final_iterations)

print(stats_collection)

我所期望的是来自print(stats_collection)的打印列表,类似于:[134, 2948, 4001, 598, 910, 1000, 2000, 3003, 10593, 403]或另一组10个数字。但是我只打印第一次运行两次,或者如果我用一个n循环替换for循环(就像在while i < 10或其他什么地方),就会打印while次。

下面是我从for i in (0, 10):得到的输出,作为在while循环上循环的机制:

代码语言:javascript
复制
Finished!
Iterations: 8598
2019-06-02 15:21:21.543503
2019-06-02 15:21:21.641444
Finished!
Iterations: 8598
2019-06-02 15:21:21.641444
2019-06-02 15:21:21.641444
[8598, 8598]

我期望代码再次运行while循环,并得到一个完全不同的结果,包括总共10个不同的结果,如下所示:

代码语言:javascript
复制
Finished!
Iterations: 8598
2019-06-02 15:21:21.543503
2019-06-02 15:21:21.641444
Finished!
Iterations: 159
2019-06-02 15:21:21.641445
2019-06-02 15:21:21.700555
[8598, 159]

但当然有十种不同的结果。

除了这个杂项错误之外,代码可以很好地工作。我真的不明白为什么代码要这么做。

看到第二个循环实际上是瞬间完成的,这可能是有用的。我根本不知道发生了什么事。我不能像那样在for循环中托管一个while循环吗?

EN

回答 2

Stack Overflow用户

发布于 2019-06-03 07:56:08

您的while循环有1/ 3125的机会在每次迭代中产生适当的顺序。大约需要2000次迭代才有50%的机会找到合适的顺序。5000次迭代将有80%的机会找到它。这应该会提供随机的执行时间,但是,由于您的代码现在很紧凑,它只会一遍又一遍地重复第一个结果。

边走边打印行会大大减慢速度。

由于您没有重置样本之间的output_order,因此您的第二次遍历将立即找到匹配结果(如时间所示),但将显示之前的迭代次数,因为您也没有重置该变量。

票数 0
EN

Stack Overflow用户

发布于 2019-06-03 07:58:40

我对您的代码做了一些修改,因为您似乎执行了很多不必要的重复。根据我对你的规范的理解,你想计算一下拼写编码器需要重复多少次。我更改了代码,使其只在随机整数与要打印的当前行的索引匹配时才移动到下一行。

代码语言:javascript
复制
`from random import randint
 from time import sleep
 import datetime


 stats_collection = []
 correct_order = [0, 1, 2, 3, 4]  # A list of numbers between 0 and 4
 iterations = 0
 the_lines = {0: "...###.................#####...####..",
         1: "..#...#.........####...#.......#...#.",
         2: "..#.......###...#...#..##......##....",
         3: "..#...#..#...#..#...#..#.......#.#...",
         4: "...###....###...####...#####...#..#..",}

for i in range(0,10):
    output_order = [None for i in range(len(correct_order))]

    a_currentDT = str(datetime.datetime.now())
    idx = 0
    while output_order != correct_order:
        next = randint(0, 4) # Select between
        if output_order[idx] == None and idx == next:
            output_order[idx] = next
            idx += 1
            print(the_lines[next])

        iterations += 1

        # sleep(0.125)
    print(output_order)

    final_iterations = iterations


    b_currentDT = str(datetime.datetime.now())

    print("Finished!")
    print("Iterations: {num}".format(num=final_iterations))
    print(a_currentDT)
    print(b_currentDT)

    stats_collection.append(final_iterations)
    iterations = 0

print(stats_collection)`

我也有一个修改,最接近匹配你在一开始。

代码语言:javascript
复制
`from random import randint
from time import sleep
import datetime


stats_collection = []
correct_order = [0, 1, 2, 3, 4]  # A list of numbers between 0 and 4
iterations = 0
the_lines = {0: "...###.................#####...####..",
             1: "..#...#.........####...#.......#...#.",
             2: "..#.......###...#...#..##......##....",
             3: "..#...#..#...#..#...#..#.......#.#...",
             4: "...###....###...####...#####...#..#..",}

for i in range(0,10):
    output_order = []

    a_currentDT = str(datetime.datetime.now())

    while output_order[-5:] != correct_order:
        next = randint(0, 4) # Select between
        output_order.append(next)
        iterations += 1
        # print(the_lines[next])
        # sleep(0.125)
    # print(output_order[-5:])

    final_iterations = iterations


    b_currentDT = str(datetime.datetime.now())

    print("Finished!")
    print("Iterations: {num}".format(num=final_iterations))
    print(a_currentDT)
    print(b_currentDT)

    stats_collection.append(final_iterations)
    iterations = 0

print(stats_collection)`
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56419454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档