randint - random.sample python




Como selecionar aleatoriamente um item de uma lista? (10)

Como selecionar aleatoriamente um item de uma lista?

Suponha que eu tenha a seguinte lista:

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

Qual é a maneira mais simples de recuperar um item aleatoriamente dessa lista?

Se você quiser perto de verdadeiramente aleatório , sugiro usar um objeto SystemRandom do módulo random com o método de choice :

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

E agora:

>>> 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'

Se você quiser uma seleção pseudo-aleatória determinística, use a função choice (que é na verdade um método ligado em um objeto Random ):

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

Parece aleatório, mas na verdade não é, o que podemos ver se formos repeti-lo repetidamente:

>>> 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')

Suponha que eu tenha a seguinte lista:

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

Qual é a maneira mais simples de recuperar um item aleatoriamente dessa lista?


A partir do Python 3.6 você pode usar o módulo secrets , que é preferível ao módulo random para criptografia ou uso de segurança.

Para imprimir um elemento aleatório de uma lista:

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

Para imprimir um índice aleatório:

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

Para mais detalhes, consulte o PEP 506 .


Eu fiz isso para que funcionasse:

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

Nós também podemos fazer isso usando o randint.

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)

Proponho um script para remover itens selecionados aleatoriamente de uma lista até que ela esteja vazia:

Mantenha um set e remova o elemento escolhido aleatoriamente (com choice ) até que a lista esteja vazia.

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

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

Três corridas dão três respostas diferentes:

>>> 
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([])

Se você quiser selecionar aleatoriamente mais de um item de uma lista ou selecionar um item de um conjunto, recomendamos usar random.sample .

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] 

Se você está apenas puxando um único item de uma lista, a escolha é menos desajeitada, já que usar sample teria a sintaxe random.sample(some_list, 1)[0] invés de random.choice(some_list) .

Infelizmente, a escolha só funciona para uma única saída de seqüências (como listas ou tuplas). Embora random.choice(tuple(some_set)) pode ser uma opção para obter um único item de um conjunto.

EDIT: Usando segredos

Como muitos apontaram, se você precisar de amostras pseudo-aleatórias mais seguras, você deve usar o módulo de segredos:

import secrets                              # imports secure module.
secure_random = secrets.SystemRandom()      # creates a secure random object.
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 = secure_random.sample(group_of_items, num_to_select)
first_random_item = list_of_random_items[0]
second_random_item = list_of_random_items[1]

Uma solução fácil se você está procurando algo como isto:

from random import *
library = ["New York", "Berlin", "Rome"]

for x in range (10):
    i = randrange(0,3)
    print(library[i])

Use random.choice :

import random

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

Para escolhas aleatórias criptograficamente seguras (por exemplo, para gerar uma senha de uma lista de palavras), use a classe random.SystemRandom :

import random

foo = ['battery', 'correct', 'horse', 'staple']
secure_random = random.SystemRandom()
print(secure_random.choice(foo))

solução numpy : numpy.random.choice

Para esta pergunta, funciona da mesma forma que a resposta aceita ( import random; random.choice() ), mas eu adicionei porque o programador pode ter importado já numpy (como eu) e também existem algumas diferenças entre os dois métodos que pode se referir ao seu caso de uso real.

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

Para reprodutibilidade, você pode fazer:

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

Para amostras de um ou mais itens , retornados como uma array , passe o argumento de size :

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

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

Espero que você ache essa solução útil.





random