semilla randint rand how float python random unique

python - randint - Genera ''n'' números aleatorios únicos dentro de un rango



random uniform python (4)

Esta pregunta ya tiene una respuesta aquí:

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 una cantidad n 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 en esa lista sea único. Además de una carga de enunciados condicionales, ¿existe una manera directa de generar n números de números aleatorios únicos?

EDITAR: Lo importante es que cada número en la lista es diferente a los demás.

Asi que

[12, 5, 6, 1] = bueno

Pero

[12, 5, 5, 1] ​​= malo, porque el número 5 aparece dos veces.


Primero genere el rango de datos y luego divídalo de esta manera

import random data = 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)


Puede agregar a un set hasta llegar a n :

setOfNumbers = set() while len(setOfNumbers) < n: setOfNumbers.add(random.randint(numLow, numHigh))

Tenga cuidado de tener un rango menor que el que cabe en n . Se repetirá siempre, no podrá encontrar nuevos números para insertar hasta n


Puede usar la función random.sample de random.sample para seleccionar k elementos de la población :

import random random.sample(range(low, high), n)

En caso de un rango bastante grande de números posibles, puede usar itertools.islice con 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

ACTUALIZAR

Entonces, después de la actualización de la pregunta, ahora está claro que necesita n números distintos.

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)


Si solo necesita un 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 para el caso donde k es más grande que len(population) , necesita estar preparado para atrapar un ValueError :

>>> try: ... random.sample(range(1, 2), 3) ... except ValueError: ... print(''Sample size exceeded population size.'') ... Sample size exceeded population size