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))
secrets
es nuevo en Python 3.6, en versiones anteriores de Python puede usar la random.SystemRandom
clase:
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.sample
lugar.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
secrets
se 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.randrange
fuente
A partir de Python 3.6, puede usar el
secrets
módulo, que es preferible alrandom
mó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
set
y elimine el elemento seleccionado aleatoriamente (conchoice
) hasta que la lista esté vacía.Tres carreras dan tres respuestas diferentes:
fuente
random.shuffle
lalist
vez 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.choices
es con reemplazo mientras querandom.sample
es sin reemplazo.numpy
solución:numpy.random.choice
Para esta pregunta, funciona igual que la respuesta aceptada (
import random; random.choice()
), pero la agregué porque el programador puede haber importadonumpy
ya (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 elsize
argumento:fuente
Si quieres cerca de ser verdaderamente aleatorio , entonces sugiero
secrets.choice
de la biblioteca estándar (Nuevo en Python 3.6.):Lo anterior es equivalente a mi recomendación anterior, usando un
SystemRandom
objeto delrandom
módulo con elchoice
método, disponible anteriormente en Python 2:Y ahora:
Si desea una selección pseudoaleatoria determinista, use la
choice
función (que en realidad es un método enlazado en unRandom
objeto):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
SystemRandom
objeto 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.random
usagetrandbits
para obtener un número adecuado de bits para generar un resultado pararandrange
s más grandes (random.choice
también se usa eso). Esto es cierto tanto en 2.7 como en 3.5. Solo se usaself.random() * len(seq)
cuandogetrandbits
no 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
sample
mé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()
?None
la 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