打算是一个有限的循环,但似乎是无限的

Intended to be a limited loop, but seems to be infinite

我想完成以下任务:

Given a number N, let's say it's 5. I want to generate a list with all numbers in the range from 1 to N (5) with no duplicates in a random order.

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

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)

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

为什么是死循环?

这个呢?

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

您需要做一个小改动 @ 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]