numeros - lista random python




¿Cómo seleccionar aleatoriamente un elemento de una lista? (10)

¿Cómo seleccionar aleatoriamente un elemento de una lista?

Supongamos que tengo la siguiente lista:

>>> import random
>>> sr = random.SystemRandom()
>>> foo = list('abcde')
>>> foo
['a', 'b', 'c', 'd', 'e']

¿Cuál es la forma más sencilla de recuperar un elemento al azar de esta lista?

Si desea que sea casi aleatorio , sugiero usar un objeto SystemRandom del módulo random con el método de choice :

>>> sr.choice(foo)
'd'
>>> sr.choice(foo)
'e'
>>> sr.choice(foo)
'a'
>>> sr.choice(foo)
'b'
>>> sr.choice(foo)
'a'
>>> sr.choice(foo)
'c'
>>> sr.choice(foo)
'c'

Y ahora:

>>> random.choice
<bound method Random.choice of <random.Random object at 0x800c1034>>

Si desea una selección pseudoaleatoria determinística, use la función de choice (que en realidad es un método enlazado en un objeto Random ):

>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')
>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')
>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')
>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')
>>> random.seed(42); random.choice(foo), random.choice(foo), random.choice(foo)
('d', 'a', 'b')

Parece aleatorio, pero en realidad no lo es, lo que podemos ver si lo reiniciamos repetidamente:

import numpy as np    
np.random.choice(foo) # randomly selects a single item

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?


A partir de Python 3.6 puede utilizar el módulo de secrets , que es preferible al módulo random para criptografía o usos de seguridad.

Para imprimir un elemento aleatorio de una lista:

print(secrets.randbelow(len(foo)))

Para imprimir un índice aleatorio:

s=set(range(1,6))
import random

while len(s)>0:
  s.remove(random.choice(list(s)))
  print(s)

Para más detalles, ver PEP 506 .


Este es el código con una variable que define el índice aleatorio:

import random

foo = ['a', 'b', 'c', 'd', 'e']
print (foo[random.randint(0,len(foo)-1)])

Este es el código sin la variable:

import random

foo = ['a', 'b', 'c', 'd', 'e']
print(random.choice(foo))

Y este es el código de la forma más rápida e inteligente de hacerlo:

foo = ['a', 'b', 'c', 'd', 'e']
number_of_samples = 1

(Python 2.7)


Hice esto para que funcione:

import random_necessary
pick = ['Miss','Mrs','MiSs','Miss']
print  pick [int(random_necessary.random_necessary() * len(pick))]

Si desea seleccionar aleatoriamente más de un elemento de una lista, o seleccionar un elemento de un conjunto, recomiendo usar random.sample en random.sample lugar.

import random
group_of_items = {1, 2, 3, 4}               # a sequence or set will work here.
num_to_select = 2                           # set the number to select here.
list_of_random_items = random.sample(group_of_items, num_to_select)
first_random_item = list_of_random_items[0]
second_random_item = list_of_random_items[1] 

Sin embargo, si solo está extrayendo un solo elemento de una lista, la opción es menos torpe, ya que usar sample tendría la sintaxis random.sample(some_list, 1)[0] lugar de random.choice(some_list) .

Sin embargo, 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: Usando Secretos

Como muchos han señalado, si necesita muestras pseudoaleatorias más seguras, debe usar el módulo de secretos:

import secrets
foo = ['a', 'b', 'c', 'd', 'e']
print(secrets.choice(foo))

Si necesitas el índice solo usa:

foo = ['a', 'b', 'c', 'd', 'e']  

random.choice hace lo mismo :)


También podemos hacer esto usando randint.

import random as random
random.seed(0)  # don't use seed function, if you want different results in each run
print(random.sample(foo,3))  # 3 is the number of sample you want to retrieve

Output:['d', 'e', 'a']

Una solución fácil si buscas algo como esto:

import random
pick = ['Random','Random1','Random2','Random3']
print  (pick[int(random.random() * len(pick))])

solución numpy.random.choice : numpy.random.choice

Para esta pregunta, funciona igual que la respuesta aceptada ( import random; random.choice() ), pero la agregué porque el programador ya puede haber importado numpy (como yo) y también hay algunas diferencias entre los dos métodos que puede referirse a su caso de uso real.

np.random.seed(123)
np.random.choice(foo) # first call will always return 'c'

Para reproducibilidad, puedes hacer:

np.random.choice(foo, 5)          # sample with replacement (default)
np.random.choice(foo, 5, False)   # sample without replacement

Para muestras de uno o más elementos , devueltos como una array , pase el argumento de size :

from random import randint
l= ['a','b','c']

def get_rand_element(l):
    if l:
        return l[randint(0,len(l)-1)]
    else:
        return None

get_rand_element(l)

 import random_necessary pick = ['Miss','Mrs','MiSs','Miss'] print pick [int(random_necessary.random_necessary() * len(pick))] 

Espero que encuentre útil esta solución.





random