在一个范围内生成“n”唯一的随机数字

我知道如何在Python中生成一个范围内的随机数。

random.randint(numLow, numHigh) 

而且我知道我可以把它放在一个循环中生成n个这样的数字

 for x in range (0, n): listOfNumbers.append(random.randint(numLow, numHigh)) 

但是,我需要确保列表中的每个数字都是唯一的。 除了加载条件语句之外,还有一种简单的方法可以生成n个唯一的随机数字吗?

编辑:重要的是,在列表中的每个数字是不同的其他人..

所以

[12,5,6,1] =好

[12,5,5,1] =坏,因为数字5出现两次。

如果您只是需要取样而不更换:

 >>> import random >>> random.sample(range(1, 100), 3) [77, 52, 45] 

random.sample需要一个人口和一个样本量k并返回k随机的人口成员。

如果必须控制k大于len(population) ,则需要准备好捕获ValueError

 >>> try: ... random.sample(range(1, 2), 3) ... except ValueError: ... print('Sample size exceeded population size.') ... Sample size exceeded population size 

你可以添加到一个set直到你到达n

 setOfNumbers = set() while len(setOfNumbers) < n: setOfNumbers.add(random.randint(numLow, numHigh)) 

请小心范围小于n 。 它将永远循环,无法find新的数字插入到n

首先生成数据的范围,然后像这样洗牌

 import random data = range(numLow, numHigh) random.shuffle(data) print data 

通过这样做,你将得到在特定范围内的所有数字,但是以随机顺序。

但是你可以使用random.sample来获取你需要的元素的数量,从这样的数字范围

 print random.sample(range(numLow, numHigh), 3) 

您可以使用标准库中的 random.sample函数从人口中selectk个元素:

 import random random.sample(range(low, high), n) 

在可能的数字范围相当大的情况下,你可以使用itertools.islice与无限的随机生成器:

 import itertools import random def random_gen(low, high): while True: yield random.randrange(low, high) gen = random_gen(1, 100) items = list(itertools.islice(gen, 10)) # take first 10 random elements 

UPDATE

所以,在问题更新之后,现在很清楚,你需要n个不同的(唯一的)数字。

 import itertools import random def random_gen(low, high): while True: yield random.randrange(low, high) gen = random_gen(1, 100) items = set() # try to add elem to set until set length is less than 10 for x in itertools.takewhile(lambda x: len(items) < 10, gen): items.add(x)