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.
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
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)
_
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
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)