【问题标题】:Intended to be a limited loop, but seems to be infinite打算成为一个有限的循环,但似乎是无限的
【发布时间】:2021-02-26 22:19:07
【问题描述】:

我想做以下任务:

给定一个数字 N,假设它是 5。我想生成一个列表,其中包含从 1 到 N (5) 范围内的所有数字,并且不以随机顺序重复。

所以我写了这段代码。使用这些调试输出,我意识到循环几乎是无限的,即使它不应该是。

import random
def generate(n):
    amount = n
    print('Line 1 success') #TODO:DEBUG
    randnum = 0
    print('Line 2 success') #TODO:DEBUG
    finished = False
    print('Line 3 success') #TODO:DEBUG
    nums = []
    print('Line 4 success') #TODO:DEBUG
    while amount != 0:
        while finished != True:
            print('Line 5 success', amount) #TODO:DEBUG
            randnum = random.randint(1,n)
            print('Line 6 success') #TODO:DEBUG
            if not randnum in nums:
                finished = True
                nums.append(randnum)
                print('Generation', amount, 'success') #TODO:DEBUG
                print(nums, ' ; ', randnum) #TODO:DEBUG
                print('Line 7 success') #TODO:DEBUG
            amount = amount - 1
            print('Line 8 success') #TODO:DEBUG
            finished = False
            print('Line 9 success') #TODO:DEBUG
    print(nums)


generate(5)

它给了我一个无限循环,我不知道为什么以及如何解决它。

为什么是无限循环?

【问题讨论】:

  • 问题是什么?
  • 看起来你有一个无限循环。?如果您正在使用 IDE,现在是学习其调试功能的好时机 - 例如逐步执行、设置断点和检查值。或者你可以花点时间熟悉一下内置的Python debugger
  • 我在nums.append 之后添加了print(f'found another {nums}') 并得到了...Generation -4 success found another [4, 5, 3, 1, 2]...,这样正在工作。
  • 那么问题是什么?
  • 今后,当您得到代码中众多问题的答案时,请不要修改您的问题。一问一答。这不是一个讨论论坛。我对使用 IDE 的调试功能或学习 pdb 模块的评论是建设性的,从长远来看会对你有所帮助。

标签: python list random append generator


【解决方案1】:

这个怎么样?

import random
def generate(n):
  l = []
  for i in range(0,n,1):
    l.append(i)
  random.shuffle(l)

根据您的评论,这应该可行:

import random
def generate(n):
  l = []
  z = 0
  while z < n:
    x = random.randint(0,n)
    if x not in l:
      z +=1
      l.append(x)
  return l

【讨论】:

  • 我希望它们以随机顺序生成,但它们似乎以相同的顺序生成。
  • @LeopardLGD 检查这是否适合你,我刚刚添加了一些东西。
  • 什么都不输出
  • @LeopardLGD - 它返回一个值 - 有人会说函数应该返回一个值。试试print(generate(5))
  • 只需在返回之前添加print(l) 或@wwii 所说的将其包装在print(generate(n))
【解决方案2】:

你需要做一个小改动@amount = amount -1

这样,每次生成唯一的 randnum 时都会附加您的列表。

我还更新了循环中断条件以降低时间复杂度。

import random
def generate(n):
    amount = n
    randnum = 0
    finished = False
    nums = []
    while amount > 0 and finished != True:
        randnum = random.randint(1,n)
        if not randnum in nums:
            finished = True
            nums.append(randnum)
            amount = amount - 1
            finished = False
    print(nums)


generate(5)

OUTPUT : [4, 1, 3, 5, 2]

【讨论】:

  • 如果我删除randnum = 0 行怎么办?它会停止工作吗?
  • 我几乎不知道什么是时间复杂度。删除这条线会减少它吗?
  • 有一些简单的方法可以让你有效地重写你的程序。我会推荐 @grumpyp 回答开始。
  • 别担心,你很快就会找到时间来解决“时间复杂度”的问题。 towardsdatascience.com/…
  • 我有点喜欢他的回答,但我真的不想重写我的整个程序并失去一切
猜你喜欢
  • 2014-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 2022-01-23
  • 1970-01-01
  • 2023-03-20
相关资源
最近更新 更多