libreria - lista de numeros aleatorios en python
¿Cómo seleccionar aleatoriamente un elemento de una lista? (15)
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?
¿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
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 .
El siguiente código muestra si necesita producir los mismos artículos. También puede especificar cuántas muestras desea extraer.
El método de sample
devuelve una nueva lista que contiene elementos de la población y deja la población original sin cambios. La lista resultante está en orden de selección, de modo que todos los sub-cortes también serán muestras aleatorias válidas.
from random import *
library = ["New York", "Berlin", "Rome"]
for x in range (10):
i = randrange(0,3)
print(library[i])
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))]
Propongo un script para eliminar los elementos recogidos al azar de una lista hasta que esté vacío:
Mantenga un set
y elimine el elemento seleccionado aleatoriamente (con la choice
) hasta que la lista esté vacía.
>>>
set([1, 3, 4, 5])
set([3, 4, 5])
set([3, 4])
set([4])
set([])
>>>
set([1, 2, 3, 5])
set([2, 3, 5])
set([2, 3])
set([2])
set([])
>>>
set([1, 2, 3, 5])
set([1, 2, 3])
set([1, 2])
set([1])
set([])
Tres carreras dan tres respuestas diferentes:
import random
foo = [''a'', ''b'', ''c'', ''d'', ''e'']
randomindex = random.randint(0,len(foo)-1)
print (foo[randomindex])
## print (randomindex)
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 :)
Si también necesita el índice, use random.randrange
from random import randrange
random_index = randrange(len(foo))
print(foo[random_index])
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))])
Use random.choice
:
import random
foo = [''a'', ''b'', ''c'', ''d'', ''e'']
print(random.choice(foo))
Para las opciones aleatorias seguras criptográficamente (por ejemplo, para generar una frase de contraseña a partir de una lista de palabras), use la clase random.SystemRandom
:
import random
foo = [''battery'', ''correct'', ''horse'', ''staple'']
secure_random = random.SystemRandom()
print(secure_random.choice(foo))
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_items = random.sample(population=foo, k=number_of_samples)
En Python 2:
random_items = random.choices(population=foo, k=number_of_samples)
En Python 3:
import random
foo = [''a'', ''b'', ''c'', ''d'', ''e'']
print int(random.random() * len(foo))
print foo[int(random.random() * len(foo))]