繁体   English   中英

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

[英]Generate list of 5 non-repeating integers

我是 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 函数。

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

您可以使用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 个步骤。

使用random.sample

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

这会生成一个包含19之间的四个随机值的列表,没有重复。

您的问题是,您要迭代 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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM