Générer ' n ' des nombres aléatoires uniques dans une plage [dupliquer]
cette question a déjà une réponse ici:
je sais générer un nombre aléatoire dans une plage en Python.
random.randint(numLow, numHigh)
Et je sais que je peux mettre ça dans une boucle pour générer n montant de ces numéros
for x in range (0, n):
listOfNumbers.append(random.randint(numLow, numHigh))
Cependant, je dois m'assurer que chaque nombre dans cette liste est unique. Autre qu'une charge d'énoncés conditionnels y a-t-il une façon 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..
Donc
[12, 5, 6, 1] = bon
mais
[12, 5, 5, 1] = mauvais, parce que le nombre 5 se produit deux fois.
4 réponses
si vous n'avez besoin que d'un échantillonnage sans remplacement:
>>> import random
>>> random.sample(range(1, 100), 3)
[77, 52, 45]
aléatoire.l'échantillon prend une population et une taille d'échantillon k
et retourne k
membres aléatoires de la population.
si vous devez contrôler pour le cas où k
est plus grand que len(population)
, vous devez être prêt à attraper un ValueError
:
>>> try:
... random.sample(range(1, 2), 3)
... except ValueError:
... print('Sample size exceeded population size.')
...
Sample size exceeded population size
D'abord générer la gamme de données et ensuite la mélanger comme ceci
import random
data = range(numLow, numHigh)
random.shuffle(data)
print data
en faisant cela, vous obtiendrez tous les nombres dans la gamme particulière 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 gamme de nombres comme celui-ci
print random.sample(range(numLow, numHigh), 3)
vous pouvez ajouter à un set
jusqu'à ce que vous atteigniez n
:
setOfNumbers = set()
while len(setOfNumbers) < n:
setOfNumbers.add(random.randint(numLow, numHigh))
faire attention d'avoir une portée plus petite que celle de n
. Il sera 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 gamme assez large de nombres possibles, vous pouvez utiliser itertools.islice
avec 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
mise à JOUR
donc, après la mise à jour des questions, il est maintenant clair, que vous avez besoin de n numéros 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)