Генерировать "n" уникальные случайные числа в пределах диапазона

Я знаю, как генерировать случайное число в пределах диапазона в Python.

random.randint(numLow, numHigh)

И я знаю, что могу поместить это в цикл, чтобы генерировать n количество этих чисел

for x in range (0, n):
    listOfNumbers.append(random.randint(numLow, numHigh))

Однако мне нужно убедиться, что каждый номер в этом списке уникален. Помимо нагрузки условных операторов существует простой способ генерации n числа уникальных случайных чисел?

EDIT: важно то, что каждое число в списке отличается от других.

So

[12, 5, 6, 1] = хорошо

Но

[12, 5, 5, 1] ​​= плохо, потому что число 5 происходит дважды.

Ответ 1

Если вам просто нужна выборка без замены:

>>> 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

Ответ 2

Сначала создайте диапазон данных, а затем перетасуйте его так:

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

Таким образом, вы получите все числа в определенном диапазоне, но в произвольном порядке.

Но вы можете использовать random.sample, чтобы получить необходимое количество элементов из диапазона чисел, подобных этому

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

Ответ 3

Вы можете добавить к set, пока не достигнете n:

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

Будьте осторожны с меньшим диапазоном, чем в n. Он будет зависеть навсегда, не в состоянии найти новые номера для вставки до n

Ответ 4

Вы можете использовать функцию 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

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)