生成5个非重复整数的列表

时间:2018-10-27 15:14:22

标签: python python-3.x

我是Python的新手,我正在尝试生成一个4个随机数的列表,该整数的整数在1到9之间。该列表不得包含重复的整数。

我遇到的问题是该程序每次都不会输出正好4个数字。有时它会生成3个数字或2个数字,但我不知道如何解决它。

我的代码:

import random
lst = []
for i in range(5):
     r = random.randint(1,9)
     if r not in lst: lst.append(r)
print(lst)

有没有没有random.sample的方法吗?这段代码是学校分配的一部分,我的老师不希望我们使用random.sample或random.shuffle函数。

4 个答案:

答案 0 :(得分:4)

您的代码会生成5个随机数,但是它们不一定是唯一的。如果生成了2,而您在2中已经有list,则您无需附加它,而实际上应该生成一个尚未使用的替代数字。

您可以使用while循环来测试是否已经有足够的数字:

result = []  # best not to use list as a variable name!
while len(result) < 5:
    digit = random.randint(1, 9)
    if digit not in result:
        result.append(digit)

但是,这比实际需要的工作还要多,并且从理论上讲可能要花很多时间(因为相同4个初始数字的数百万次重复仍然被认为是随机的)。标准库为此任务提供了更好的方法。

相反,您可以使用random.sample()range()对象中获取5个唯一数字:

result = random.sample(range(1, 10), 5)

保证从该范围中获取5个值,且不重复数字,并且分5步进行。

答案 1 :(得分:1)

使用random.sample

import random
random.sample(range(1, 10), 4)

这将生成19之间的四个随机值的列表,没有重复项。

答案 2 :(得分:1)

您的问题是,您要迭代5次,随机范围是1-9。这意味着您有大约50/50的机会获得重复整数,这可以防止您的条件被附加到列表中。

这将为您提供更好的服务:

def newRunLst():
     lst = []
     while len(lst) < 4:
          r = random.randint(1,9)
          if r not in lst: lst.append(r)
     print lst

答案 3 :(得分:0)

如果需要的随机列表不是太小(与总列表相比)那么可以

  1. 生成随机数的索引数据帧
  2. 排序并
  3. 从顶部选择......喜欢
(pd.DataFrame([(i,np.random.rand()) for i in range(10)]).sort_values(by=1))[0][:5].sort_index()