Supongamos que tengo la siguiente lista:
foo = ['a', 'b', 'c', 'd', 'e']
¿Cuál es la forma más sencilla de recuperar un elemento al azar de esta lista?
Utilizar random.choice()
import random
foo = ['a', 'b', 'c', 'd', 'e']
print(random.choice(foo))
Para opciones aleatorias criptográficamente seguras (por ejemplo, para generar una frase de contraseña a partir de una lista de palabras) usesecrets.choice()
import secrets
foo = ['battery', 'correct', 'horse', 'staple']
print(secrets.choice(foo))
secretses nuevo en Python 3.6, en versiones anteriores de Python puede usar la random.SystemRandomclase:
import random
secure_random = random.SystemRandom()
print(secure_random.choice(foo))
random.choice(foo)devuelve dos resultados diferentes?random.sample(lst, n)Standard pseudo-random generators are not suitable for security/cryptographic purposes.refSi desea seleccionar aleatoriamente más de un elemento de una lista, o seleccionar un elemento de un conjunto, le recomiendo usar en su
random.samplelugar.Sin embargo, si solo está sacando un solo elemento de una lista, la elección es menos complicada, ya que usar sample tendría la sintaxis en
random.sample(some_list, 1)[0]lugar derandom.choice(some_list).Desafortunadamente, la elección solo funciona para una única salida de secuencias (como listas o tuplas). Aunque
random.choice(tuple(some_set))puede ser una opción para obtener un solo elemento de un conjunto.EDITAR: uso de secretos
Como muchos han señalado, si necesita muestras pseudoaleatorias más seguras, debe usar el módulo de secretos:
EDITAR: Pythonic One-Liner
Si desea una línea más pitónica para seleccionar varios elementos, puede usar el desempaquetado.
fuente
secretsse añadió el módulo de la biblioteca estándar de Python en la versión 3.6 python.org/dev/peps/pep-0506Si también necesita el índice, use
random.randrangefuente
A partir de Python 3.6, puede usar el
secretsmódulo, que es preferible alrandommódulo para criptografía o usos de seguridad.Para imprimir un elemento aleatorio de una lista:
Para imprimir un índice aleatorio:
Para más detalles, ver PEP 506 .
fuente
Propongo un script para eliminar elementos seleccionados aleatoriamente de una lista hasta que esté vacío:
Mantenga
sety elimine el elemento seleccionado aleatoriamente (conchoice) hasta que la lista esté vacía.Tres carreras dan tres respuestas diferentes:
fuente
random.shufflelalistvez y, o bien iterate o el pop para producir resultados. Cualquiera de los dos resultaría en una secuencia de "selección aleatoria sin repeticiones" perfectamente adecuada, es solo que la aleatoriedad se introduciría al principio.En python 2:
En python 3:
fuente
random.choiceses con reemplazo mientras querandom.samplees sin reemplazo.numpysolución:numpy.random.choicePara esta pregunta, funciona igual que la respuesta aceptada (
import random; random.choice()), pero la agregué porque el programador puede haber importadonumpyya (como yo) y también hay algunas diferencias entre los dos métodos que pueden afectar a su caso de uso real.Para la reproducibilidad, puede hacer:
Para muestras de uno o más elementos , devueltos como un
array, pase elsizeargumento:fuente
Si quieres cerca de ser verdaderamente aleatorio , entonces sugiero
secrets.choicede la biblioteca estándar (Nuevo en Python 3.6.):Lo anterior es equivalente a mi recomendación anterior, usando un
SystemRandomobjeto delrandommódulo con elchoicemétodo, disponible anteriormente en Python 2:Y ahora:
Si desea una selección pseudoaleatoria determinista, use la
choicefunción (que en realidad es un método enlazado en unRandomobjeto):Parece aleatorio, pero en realidad no lo es, lo que podemos ver si lo resembramos repetidamente:
Un comentario:
Bueno, sí, puedes pasarle un argumento "semilla", pero verás que el
SystemRandomobjeto simplemente lo ignora :fuente
si necesitas el índice solo usa:
random.choice hace lo mismo :)
fuente
random.choice(self, seq)isreturn seq[int(self.random() * len(seq))].randrange()que significa, por ejemplo,random.SystemRandom().randrange(3<<51)exhibe un sesgo significativo. Suspiro ...float(un doble IEEE) solo puede tomar un número finito de valores en [0,1].Random.random()genera su salida de la manera tradicional: selecciona un número entero aleatorio[0, 2**53)y divide entre2**53(53 es el número de bits en un doble). Entoncesrandom()devuelve 2 ** 53 dobles equiprobables, y puede dividir esto uniformemente en N salidas solo si N es una potencia de 2. El sesgo es pequeño para N pequeño, pero veacollections.Counter(random.SystemRandom().randrange(3<<51)%6 for i in range(100000)).most_common(). (Random.nextInt () de Java evita este sesgo).2**40(que es 1099511627776) sería lo suficientemente pequeño como para que el sesgo no importe en la práctica. Esto realmente debería señalarse en la documentación, porque si alguien no es meticuloso, es posible que no espere que surjan problemas de esta parte de su código.randomusagetrandbitspara obtener un número adecuado de bits para generar un resultado pararandranges más grandes (random.choicetambién se usa eso). Esto es cierto tanto en 2.7 como en 3.5. Solo se usaself.random() * len(seq)cuandogetrandbitsno está disponible. No está haciendo lo estúpido que crees que es.Este es el código con una variable que define el índice aleatorio:
Este es el código sin la variable:
Y este es el código de la manera más corta e inteligente para hacerlo:
(pitón 2.7)
fuente
El siguiente código demuestra si necesita producir los mismos artículos. También puede especificar cuántas muestras desea extraer.
El
samplemétodo devuelve una nueva lista que contiene elementos de la población mientras deja la población original sin cambios. La lista resultante está en orden de selección para que todos los sub-cortes también sean muestras aleatorias válidas.fuente
Selección aleatoria de artículos:
Para preservar el orden de la lista, puede hacer lo siguiente:
Duplicado de https://stackoverflow.com/a/49682832/4383027
fuente
También podemos hacer esto usando randint.
fuente
random.choice()yrandom.randrange()?Nonela lata se lanza a un punto aleatorio posterior donde el "elemento" no válido desencadena una excepción; o peor aún, obtienes un programa incorrecto en lugar de una excepción, y ni siquiera lo sabes.Podrías simplemente:
fuente