Genere 'n' números aleatorios únicos dentro de un rango [duplicado]
Sé cómo generar un número aleatorio dentro de un rango en Python.
random.randint(numLow, numHigh)
Y sé que puedo poner esto en un bucle para generar n cantidades de estos números.
for x in range (0, n):
listOfNumbers.append(random.randint(numLow, numHigh))
Sin embargo, necesito asegurarme de que cada número de esa lista sea único. Aparte de una gran cantidad de declaraciones condicionales, ¿existe una forma sencilla de generar n números aleatorios únicos?
Lo importante es que cada número de la lista sea diferente a los demás.
Entonces
[12, 5, 6, 1] = bueno
Pero
[12, 5, 5, 1] = malo, porque el número 5 aparece dos veces.
Si solo necesita muestreo sin reemplazo:
>>> import random
>>> random.sample(range(1, 100), 3)
[77, 52, 45]
random.sample toma una población y un tamaño de muestra k
y devuelve k
miembros aleatorios de la población.
Si tiene que controlar el caso en el que k
es mayor que len(population)
, debe estar preparado para detectar un ValueError
:
>>> try:
... random.sample(range(1, 2), 3)
... except ValueError:
... print('Sample size exceeded population size.')
...
Sample size exceeded population size
Primero genere el rango de datos y luego mezclelos así
import random
data = list(range(numLow, numHigh))
random.shuffle(data)
print data
Al hacer esto, obtendrá todos los números en el rango particular pero en orden aleatorio.
Pero puedes usar random.sample
para obtener la cantidad de elementos que necesitas, a partir de un rango de números como este
print random.sample(range(numLow, numHigh), 3)
Podrías usar la random.sample
función de la biblioteca estándar para seleccionar k elementos de una población :
import random
random.sample(range(low, high), n)
En el caso de una gama bastante grande de números posibles, podría utilizar itertools.islice
un generador aleatorio infinito:
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
Después de la actualización de la pregunta, ahora queda claro que necesita n números distintos (únicos).
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)