生成范围内的 '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出现了两次。
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