Supposons que j'ai la liste suivante:
foo = ['a', 'b', 'c', 'd', 'e']
Quelle est la manière la plus simple de récupérer un élément au hasard dans cette liste?
Utilisation random.choice()
import random
foo = ['a', 'b', 'c', 'd', 'e']
print(random.choice(foo))
Pour des choix aléatoires cryptographiquement sécurisés (par exemple pour générer une phrase secrète à partir d'une liste de mots), utilisezsecrets.choice()
import secrets
foo = ['battery', 'correct', 'horse', 'staple']
print(secrets.choice(foo))
secrets
est nouveau dans Python 3.6, sur les anciennes versions de Python, vous pouvez utiliser la random.SystemRandom
classe:
import random
secure_random = random.SystemRandom()
print(secure_random.choice(foo))
random.choice(foo)
retour consécutifs donne deux résultats différents?random.sample(lst, n)
Standard pseudo-random generators are not suitable for security/cryptographic purposes.
refSi vous souhaitez sélectionner au hasard plusieurs éléments dans une liste, ou sélectionner un élément dans un ensemble, je vous recommande d'utiliser à la
random.sample
place.Si vous ne retirez qu'un seul élément d'une liste, le choix est moins maladroit, car l'utilisation de sample aurait la syntaxe à la
random.sample(some_list, 1)[0]
place derandom.choice(some_list)
.Malheureusement, le choix ne fonctionne que pour une seule sortie de séquences (telles que des listes ou des tuples). Bien que cela
random.choice(tuple(some_set))
puisse être une option pour obtenir un seul élément d'un ensemble.EDIT: Utilisation des secrets
Comme beaucoup l'ont souligné, si vous avez besoin d'échantillons pseudo-aléatoires plus sécurisés, vous devez utiliser le module secrets:
EDIT: Pythonic One-Liner
Si vous voulez une doublure plus pythonique pour sélectionner plusieurs articles, vous pouvez utiliser le déballage.
la source
secrets
module BTW a été ajouté à la bibliothèque standard Python dans la version 3.6 python.org/dev/peps/pep-0506Si vous avez également besoin de l'index, utilisez
random.randrange
la source
Depuis Python 3.6, vous pouvez utiliser le
secrets
module, qui est préférable aurandom
module pour des utilisations de cryptographie ou de sécurité.Pour imprimer un élément aléatoire à partir d'une liste:
Pour imprimer un index aléatoire:
Pour plus de détails, voir PEP 506 .
la source
Je propose un script pour supprimer les éléments ramassés au hasard d'une liste jusqu'à ce qu'elle soit vide:
Maintenez un
set
élément et supprimez-le au hasard (avecchoice
) jusqu'à ce que la liste soit vide.Trois pistes donnent trois réponses différentes:
la source
random.shuffle
le fairelist
une seule fois et le répéter ou le faire éclater pour produire des résultats. L'une ou l'autre résulterait en un flux "sélectionner au hasard parfaitement adéquat sans répétition", c'est juste que l'aléatoire serait introduit au début.En python 2:
En python 3:
la source
random.choices
c'est avec remplacement tandis qu'ilrandom.sample
est sans remplacement.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 parce que le programmeur a peut-êtrenumpy
déjà importé (comme moi) et il existe également des différences entre les deux méthodes qui peuvent concerner votre cas d'utilisation réel.Pour la reproductibilité, vous pouvez faire:
Pour les échantillons d' un ou plusieurs éléments , renvoyés sous forme de
array
, passez l'size
argument:la source
Si vous voulez près de vraiment aléatoire , alors je suggère
secrets.choice
de la bibliothèque standard (Nouveau dans Python 3.6.):Ce qui précède est équivalent à mon ancienne recommandation, en utilisant un
SystemRandom
objet durandom
module avec lachoice
méthode - disponible plus tôt dans Python 2:Et maintenant:
Si vous voulez une sélection pseudo-aléatoire déterministe, utilisez la
choice
fonction (qui est en fait une méthode liée sur unRandom
objet):Cela semble aléatoire, mais ce n'est pas le cas, ce que nous pouvons voir si nous le réensemencons à plusieurs reprises:
Un commentaire:
Eh bien, oui, vous pouvez lui passer un argument "seed", mais vous verrez que l'
SystemRandom
objet l'ignore simplement :la source
si vous avez besoin de l'index, utilisez simplement:
random.choice fait de même :)
la source
random.choice(self, seq)
isreturn seq[int(self.random() * len(seq))]
.randrange()
ce qui signifie, par exemple,random.SystemRandom().randrange(3<<51)
présente un biais significatif. Soupir ...float
(un double IEEE) ne peut prendre qu'un nombre fini de valeurs dans [0,1).Random.random()
génère sa sortie de la manière traditionnelle: choisissez un entier aléatoire[0, 2**53)
et divisez par2**53
(53 est le nombre de bits dans un double). Renvoie doncrandom()
2 ** 53 doubles équiprobables, et vous pouvez diviser cela en N sorties uniquement si N est une puissance de 2. Le biais est petit pour N petit, mais voyezcollections.Counter(random.SystemRandom().randrange(3<<51)%6 for i in range(100000)).most_common()
. (Java's Random.nextInt () évite un tel biais.)2**40
, (qui est 1099511627776), serait assez petit pour que le biais n'ait pas d'importance dans la pratique? Cela devrait vraiment être souligné dans la documentation, car si quelqu'un n'est pas méticuleux, il ne devrait pas s'attendre à ce que des problèmes viennent de cette partie de son code.random
utilisegetrandbits
pour obtenir un nombre suffisant de bits pour générer un résultat pour desrandrange
s plus grands (random.choice
utilise également cela). Cela est vrai pour les versions 2.7 et 3.5. Il utilise uniquementself.random() * len(seq)
lorsquegetrandbits
n'est pas disponible. Il ne fait pas la chose stupide que vous pensez.Voici le code avec une variable qui définit l'index aléatoire:
Voici le code sans la variable:
Et voici le code de la manière la plus courte et la plus intelligente pour le faire:
(python 2.7)
la source
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
sample
méthode 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.la source
Sélection aléatoire d'éléments:
Pour conserver l'ordre de la liste, vous pouvez faire:
Duplicata de https://stackoverflow.com/a/49682832/4383027
la source
Nous pouvons également le faire en utilisant randint.
la source
random.choice()
etrandom.randrange()
?None
ne fait que donner un coup de pied à la boîte à un point ultérieur aléatoire où «l'élément» invalide déclenche une exception; ou pire encore, vous obtenez un programme incorrect au lieu d'une exception, et vous ne le savez même pas.Vous pourriez simplement:
la source