web-dev-qa-db-fra.com

Générer des nombres aléatoires uniques 'n' dans une plage

Je sais comment générer un nombre aléatoire dans une plage en Python.

random.randint(numLow, numHigh)

Et je sais que je peux le mettre en boucle pour générer une quantité n de ces nombres

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

Cependant, je dois m'assurer que chaque numéro de cette liste est unique. Outre un ensemble d'instructions conditionnelles, existe-t-il un moyen simple de générer n nombre de nombres aléatoires uniques?

EDIT: L'important est que chaque numéro de la liste soit différent des autres.

Alors

[12, 5, 6, 1] = bien

Mais

[12, 5, 5, 1] ​​= mauvais, car le nombre 5 apparaît deux fois.

182
Chris Headleand

Si vous avez juste besoin d'échantillonnage sans remplacement:

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

random.sample prend une population et une taille d'échantillon k et renvoie k membres aléatoires de la population.

Si vous devez contrôler le cas où k est supérieur à len(population), vous devez être prêt à intercepter un ValueError:

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

Générez d'abord la plage de données, puis mélangez-la comme ceci

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

En procédant ainsi, vous obtiendrez tous les nombres de la plage en question, mais dans un ordre aléatoire.

Mais vous pouvez utiliser random.sample pour obtenir le nombre d'éléments dont vous avez besoin, à partir d'une plage de nombres comme celle-ci.

_print random.sample(range(numLow, numHigh), 3)
_
24
thefourtheye

Vous pouvez ajouter à set jusqu'à atteindre n:

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

Veillez à avoir une plage plus petite que celle qui convient dans n. Il sera en boucle pour toujours, incapable de trouver de nouveaux numéros à insérer jusqu'à n

12
mhlester

Vous pouvez utiliser la fonction random.sample de bibliothèque standard pour sélectionner k éléments de population :

import random
random.sample(range(low, high), n)

En cas de plage assez large de nombres possibles, vous pouvez utiliser itertools.islice avec un générateur aléatoire infini:

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

Ainsi, après la mise à jour de la question, il est maintenant clair que vous avez besoin de n nombres distincts (uniques).

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)
5
maxbublis