Supposons que j'ai la liste suivante:
foo = ['a', 'b', 'c', 'd', 'e']
Quel est le moyen le plus simple de récupérer un élément au hasard dans cette liste?
Utilisez random.choice()
_import random
foo = ['a', 'b', 'c', 'd', 'e']
print(random.choice(foo))
_
Pour des choix aléatoires sécurisés par cryptographie (par exemple, pour générer une phrase secrète à partir d'une liste de mots), utilisez random.SystemRandom
classe
_import random
foo = ['battery', 'correct', 'horse', 'staple']
secure_random = random.SystemRandom()
print(secure_random.choice(foo))
_
_import secrets
foo = ['a', 'b', 'c', 'd', 'e']
print(secrets.choice(foo))
_
Si vous souhaitez sélectionner au hasard plus d'un élément dans une liste ou sélectionner un élément dans un jeu, je vous recommande d'utiliser random.sample
à la place.
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]
Cependant, si vous ne tirez qu'un seul élément d'une liste, le choix est moins compliqué, car utiliser sample aurait la syntaxe random.sample(some_list, 1)[0]
au lieu de random.choice(some_list)
.
Malheureusement, cependant, choix ne fonctionne que pour une seule sortie de séquences (telles que des listes ou des tuples). Bien que random.choice(Tuple(some_set))
puisse être une option pour obtenir un seul élément d'un ensemble.
EDIT: Using Secrets
Comme beaucoup l'ont fait remarquer, si vous avez besoin d'échantillons pseudo-aléatoires plus sécurisés, utilisez le module secrets:
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]
Si vous avez également besoin de l'index, utilisez random.randrange
_from random import randrange
random_index = randrange(len(foo))
print(foo[random_index])
_
À partir de Python 3.6, vous pouvez utiliser le module secrets
, qui est préférable au module random
pour la cryptographie ou la sécurité.
Pour imprimer un élément aléatoire d'une liste:
import secrets
foo = ['a', 'b', 'c', 'd', 'e']
print(secrets.choice(foo))
Pour imprimer un index aléatoire:
print(secrets.randbelow(len(foo)))
Pour plus de détails, voir PEP 506 .
Je propose un script pour supprimer les éléments choisis au hasard dans une liste jusqu'à ce qu'elle soit vide:
Conservez un set
et enlevez l'élément pris au hasard (avec choice
) jusqu'à ce que la liste soit vide.
s=set(range(1,6))
import random
while len(s)>0:
s.remove(random.choice(list(s)))
print(s)
Trois pistes donnent trois réponses différentes:
>>>
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([])
foo = ['a', 'b', 'c', 'd', 'e']
number_of_samples = 1
Dans python 2:
random_items = random.sample(population=foo, k=number_of_samples)
Dans python 3:
random_items = random.choices(population=foo, k=number_of_samples)
Comment sélectionner au hasard un élément dans une liste?
Supposons que j'ai la liste suivante:
foo = ['a', 'b', 'c', 'd', 'e']
Quel est le moyen le plus simple de récupérer un élément au hasard dans cette liste?
Si vous voulez près de vraiment aléatoire, alors je vous suggère d'utiliser un objet SystemRandom
du module random
avec la méthode choice
:
>>> import random
>>> sr = random.SystemRandom()
>>> foo = list('abcde')
>>> foo
['a', 'b', 'c', 'd', 'e']
Et maintenant:
>>> 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'
Si vous voulez une sélection pseudo-aléatoire déterministe, utilisez la fonction choice
(qui est en fait une méthode liée sur un objet Random
):
>>> random.choice
<bound method Random.choice of <random.Random object at 0x800c1034>>
Cela semble aléatoire, mais ce n’est pas le cas, ce que nous pourrons voir si nous le réensemencons à plusieurs reprises:
>>> 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')
numpy
solution: numpy.random.choice
Pour cette question, cela fonctionne de la même manière que la réponse acceptée (import random; random.choice()
), mais je l’ai ajoutée car le programmeur a peut-être déjà importé numpy
(comme moi) et aussi quelques différences entre les deux méthodes pouvant concerner votre cas d'utilisation réel.
_import numpy as np
np.random.choice(foo) # randomly selects a single item
_
Pour la reproductibilité, vous pouvez faire:
_np.random.seed(123)
np.random.choice(foo) # first call will always return 'c'
_
Pour des exemples de un ou plusieurs éléments , renvoyés sous forme de array
, transmettez l'argument size
:
_np.random.choice(foo, 5) # sample with replacement (default)
np.random.choice(foo, 5, False) # sample without replacement
_
si vous avez besoin de l'index, utilisez simplement:
import random
foo = ['a', 'b', 'c', 'd', 'e']
print int(random.random() * len(foo))
print foo[int(random.random() * len(foo))]
random.choice fait la même chose :)
C'est le code avec une variable qui définit l'index aléatoire:
import random
foo = ['a', 'b', 'c', 'd', 'e']
randomindex = random.randint(0,len(foo)-1)
print (foo[randomindex])
## print (randomindex)
C'est le code sans la variable:
import random
foo = ['a', 'b', 'c', 'd', 'e']
print (foo[random.randint(0,len(foo)-1)])
Et voici le code de la manière la plus rapide et la plus intelligente de le faire:
import random
foo = ['a', 'b', 'c', 'd', 'e']
print(random.choice(foo))
(Python 2.7)
Nous pouvons aussi faire cela en utilisant 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)
Le code suivant montre si vous devez produire les mêmes éléments. Vous pouvez également spécifier le nombre d'échantillons que vous souhaitez extraire.
La méthode sample
renvoie une nouvelle liste contenant des éléments de la population tout en laissant la population d'origine inchangée. La liste résultante est dans l'ordre de sélection afin que toutes les sous-tranches soient également des échantillons aléatoires valides.
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']
Une solution simple si vous recherchez quelque chose comme ceci:
from random import *
library = ["New York", "Berlin", "Rome"]
for x in range (10):
i = randrange(0,3)
print(library[i])
import random
my_list = [1, 2, 3, 4, 5]
num_selections = 2
new_list = random.sample(my_list, num_selections)
randIndex = random.sample(range(len(my_list)), n_selections)
randIndex.sort()
new_list = [my_list[i] for i in randIndex]
Doublon de https://stackoverflow.com/a/49682832/4383027
import random
list=range(100)
random_value=random.choice(list)
print(random_value)