Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在一定范围内生成“n”个唯一随机数_Python_Random_Unique - Fatal编程技术网

Python 在一定范围内生成“n”个唯一随机数

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

我知道如何在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
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)