Genere 'n' números aleatorios únicos dentro de un rango [duplicado]

Resuelto Chris Headleand asked hace 10 años • 4 respuestas

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.

Chris Headleand avatar Apr 03 '14 22:04 Chris Headleand
Aceptado

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 ky devuelve kmiembros aleatorios de la población.

Si tiene que controlar el caso en el que kes 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
Two-Bit Alchemist avatar Apr 03 '2014 15:04 Two-Bit Alchemist

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.samplepara obtener la cantidad de elementos que necesitas, a partir de un rango de números como este

print random.sample(range(numLow, numHigh), 3)
thefourtheye avatar Apr 03 '2014 15:04 thefourtheye

Podrías usar la random.samplefunció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.isliceun 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)
maxbublis avatar Apr 03 '2014 15:04 maxbublis