生成范围内的 'n' 个唯一随机数

369 投票
4 回答
612402 浏览
提问于 2025-04-18 01:11

我知道怎么在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出现了两次。

4 个回答

10

你可以使用标准库里的 random.sample 函数,从一组数据中选择 k 个元素:

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

在问题更新后,现在很清楚你需要 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)
16

你可以往一个 set 里添加元素,直到达到 n 的数量为止:

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

要注意,如果你设定的范围比 n 小,就会出现问题。这样的话,它会一直循环下去,因为找不到新的数字来填充到 n 的数量。

33

首先生成一系列数据,然后像这样打乱顺序。

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

这样做的话,你会得到特定范围内的所有数字,但它们的顺序是随机的。

不过你也可以使用 random.sample 来从一系列数字中获取你需要的元素数量,像这样。

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

如果你只需要不放回的抽样:

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

random.sample 这个函数可以从一组数据中随机抽取出 k 个成员。你只需要告诉它你要抽样的总数据和想要抽取的数量 k

如果你需要处理 k 大于数据总数的情况,记得要准备好捕捉一个 ValueError 错误:

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

撰写回答