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.

128
demandé sur ayhan 2014-04-03 19:29:57

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
214
répondu Two-Bit Alchemist 2014-04-03 15:43:08

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)
17
répondu thefourtheye 2014-04-03 15:31:46

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

12
répondu mhlester 2014-04-03 15:32:46

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)
4
répondu maxbublis 2014-04-03 16:05:24