在一个范围内生成“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)