如何在Python中随机化数字时防止重复?

时间:2017-01-12 15:01:57

标签: python algorithm

from random import randint
def random_number():
    return randint (1,10)

rn1 = random_number()

rn2 = random_number()
while rn2 == rn1:

    rn2 = random_number()

rn3 = random_number()
while rn3 == rn1 or rn3 == rn2:

    rn3 = random_number() 

rn4 = random_number()
while rn4 == rn1 or rn4 == rn2 or rn4 == rn3: 

    rn4 = random_number()

rn5 = random_number()
while rn5 == rn1 or rn5 == rn2 or rn5 == rn3 or rn5 == rn4: 

    rn5 = random_number()

我现在已经为这段小代码挣扎了一段时间。我正在尝试让程序随机生成5个数字。问题是该程序可以生成两次相同的数字。我正在努力确保使用算法生成的5中没有重复的数字。但是,代码仍会打印重复项。我有什么想法吗?

4 个答案:

答案 0 :(得分:5)

我认为最简单的方法是使用random.sample

import random

numbers = random.sample(range(1, 11), 5)

这样做不带替换的采样,这似乎就是你想要的。

请注意random.sample(pop, k)从人口k(列表或其他)中选择大小为pop的样本,range(a, b)的范围为a <= x < b,虽然randint的范围是a <= x <= b,但您需要在range来电的末尾添加1。

答案 1 :(得分:2)

您可以使用内置的numpy功能:

import numpy as np
np.random.choice(10,5)

Documentation here。请注意choice也有一个replacement关键字,可以在有和没有替换的情况下进行切换,如下所示:

np.random.choice(10, 5, replace=False)

请注意,所有这些都依赖于np.arange来构建要从中进行采样的数组,以便您从[0,1,...,9]进行采样 - 如果您想从1-10采样,则可以执行以下操作:< / p>

np.random.choice(range(1,11), 5, replace=False

答案 2 :(得分:0)

您可以将每个随机数添加到列表中,然后签入该列表以查看它是否已经完成:

numbers = []
while len(numbers) < 5:
    n = random_number()
    if n not in numbers:
        numbers += [n]

请注意,虽然这种方法很容易理解,但当你想要一组原始数字的大部分时效率不是很高,例如试图从1到1000000的数字集中获得1000000个数字需要很长时间由于尝试已经添加到列表中的数字而导致的时间。

答案 3 :(得分:-1)

lqSubmitted