为什么包含简单while循环的for循环只运行两次?而且很差

2024-04-20 02:49:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在这个while循环上循环几次,以收集关于输出正确的行序列所需时间的信息(拼写“CODER”)。我期望我的for循环十次。相反,我只得到一个循环,然后在0秒内完成一个故障重复。你知道吗

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

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个数字。但是我只打印了两次第一次运行,或者如果我用一个while循环替换for循环(比如while i < 10或者其他什么)。你知道吗

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

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个不同的结果,如下所示:

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循环吗?你知道吗


Tags: inimportforoutputdatetimestatsordercollection
3条回答

for i in (0,10):依次将i设置为元组(0, 10)的每个元素。具体来说,它意味着:

  • i=0运行循环体
  • i=10运行循环体
  • 完成。你知道吗

如果要在0到(但不包括)10的范围内循环,则需要写入:

for i in range(0, 10):

或者只是:

for i in range(10):

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

打印线条会大大减慢速度。你知道吗

因为您没有重置样本之间的输出顺序,所以第二次传递将立即找到匹配的结果(反映在时间中),但会显示之前的迭代次数,因为您也没有重置该变量。你知道吗

代码中有两个问题:

  1. for i in (0,10)应该是for i in range(0, 10),前者只迭代2次,即i = 0 and i = 10

  2. 你应该把output_order = []iterations = 0移到for-loop,这也是你的结果不断重复的原因,因为output_order不会重置,它会在第一次迭代后保留解。

相关问题 更多 >