Генерировать "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)