Python 在一定范围内生成“n”个唯一随机数
我知道如何在Python中生成一个范围内的随机数Python 在一定范围内生成“n”个唯一随机数,python,random,unique,Python,Random,Unique,我知道如何在Python中生成一个范围内的随机数 random.randint(numLow, numHigh) 我知道我可以把它放在一个循环中,生成n个数字 for x in range (0, n): listOfNumbers.append(random.randint(numLow, numHigh)) 但是,我需要确保列表中的每个数字都是唯一的。除了大量的条件语句之外,是否有一种直接的方法可以生成n个唯一的随机数 重要的是列表中的每个数字都是不同的 所以 [12,5,6,1
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
data = range(numLow, numHigh)
random.shuffle(data)
print data
print random.sample(range(numLow, numHigh), 3)
通过这种方式,您将获得特定范围内的所有数字,但顺序是随机的
但是你可以用它来获得你需要的元素的数量,从一系列像这样的数字中
import random
data = range(numLow, numHigh)
random.shuffle(data)
print data
print random.sample(range(numLow, numHigh), 3)
您可以添加到a,直到达到n:
注意不要让范围小于n中的范围。它将永远循环,如果您只需要采样而不需要替换,则无法找到新的数字以插入n个:
>>> import random
>>> random.sample(range(1, 100), 3)
[77, 52, 45]
获取总体和样本大小k,并返回总体的k个随机成员
如果必须控制k大于lenpopulation的情况,则需要准备捕捉ValueError:
您可以使用中的random.sample函数从总体中选择k个元素:
如果可能的数字范围较大,则可以将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
在问题更新之后,现在很清楚您需要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)
看一看:。如果您使用random.sample,它将抛出一个ValueError,您当然可以捕捉到。使用random.samplexrange1100,3-使用xrange而不是range-可以大大加快代码的速度,特别是在范围较大的情况下,因为如果不需要替换的采样需要,它只会按需生成所需的3个或更多数字,而不是整个范围。例如:%timeit random.samplexrange1000,每个循环3=4.92µs,%timeit random.samplerange10000,每个循环3=126µs如果您使用的是Python2,则是。如果您在我的回答中使用的是Python 3,那么它已经在这样做了,因为Py3k中的xrange->range.We可以不将random.sample调用包含在try中…除了块之外,检查上面示例3的大小是否小于或等于@h4k1m,您可以,但在Python中,通常EAFP try/except在风格上优于LBYL if/else。要在Python 3中洗牌一个范围,您首先需要将其强制转换为一个列表:data=listrangenumLow,numHigh,否则您将得到一个错误。
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)