359 votes

Obtenir un booléen aléatoire en python ?

Je cherche la meilleure façon (rapide et élégante) d'obtenir un booléen aléatoire en python (tirer à pile ou face).

Pour l'instant, j'utilise random.randint(0, 1) o random.getrandbits(1) .

Existe-t-il de meilleurs choix dont je ne suis pas conscient ?

5 votes

Il s'agit d'une question pertinente et valide sur les performances des différentes options permettant d'obtenir un booléen aléatoire, mais j'ai l'impression que le fait que la meilleure solution gagne moins d'une seconde par rapport à la moins bonne solution qui gagne plus d'une seconde est perdu dans le bruit de tous les benchmarks. million itérations. Si vous êtes venu ici pour trouver un moyen d'accélérer une application, vous devriez probablement commencer par examiner d'autres options.

478voto

gnibbler Points 103484

La réponse d'Adam est assez rapide, mais j'ai trouvé que random.getrandbits(1) pour être beaucoup plus rapide. Si vous voulez vraiment un booléen au lieu d'un long, alors

bool(random.getrandbits(1))

est toujours environ deux fois plus rapide que random.choice([True, False])

Les deux solutions doivent import random

Si la vitesse maximale n'est pas une priorité, alors random.choice se lit définitivement mieux.

Notez que random.choice() est plus lent que le simple choice() (après from random import choice ) en raison de la recherche d'attributs.

$ python3 --version
Python 3.9.7
$ python3 -m timeit -s "from random import choice" "choice([True, False])"
1000000 loops, best of 5: 376 nsec per loop
$ python3 -m timeit -s "from random import choice" "choice((True, False))"
1000000 loops, best of 5: 352 nsec per loop
$ python3 -m timeit -s "from random import getrandbits" "getrandbits(1)"
10000000 loops, best of 5: 33.7 nsec per loop
$ python3 -m timeit -s "from random import getrandbits" "bool(getrandbits(1))"
5000000 loops, best of 5: 89.5 nsec per loop
$ python3 -m timeit -s "from random import getrandbits" "not getrandbits(1)"
5000000 loops, best of 5: 46.3 nsec per loop
$ python3 -m timeit -s "from random import random" "random() < 0.5"
5000000 loops, best of 5: 46.4 nsec per loop

29 votes

Si nous sommes tous sur la performance, not not random.getrandbits(1)) est plus rapide que bool ;)

17 votes

Il est probable que vous n'ayez même pas besoin d'utiliser un booléen, puisque les valeurs 0/1 ont les valeurs de vérité appropriées.

13 votes

Vous pouvez accélérer le processus en faisant from random import getrandbits pour éviter la recherche d'attributs :-)

267voto

Adam Vandenberg Points 8098
import random
random.choice([True, False])

fonctionnerait également.

0 votes

Dois-je importer une bibliothèque ?

2 votes

1 votes

En effet, le même random utilisé par la plupart des autres réponses ici.

55voto

Pavel Radchenko Points 51

J'ai trouvé une méthode plus rapide :

$ python -m timeit -s "from random import getrandbits" "not getrandbits(1)"
10000000 loops, best of 3: 0.222 usec per loop
$ python -m timeit -s "from random import random" "True if random() > 0.5 else False"
10000000 loops, best of 3: 0.0786 usec per loop
$ python -m timeit -s "from random import random" "random() < 0.5"
10000000 loops, best of 3: 0.0579 usec per loop

6 votes

random() > 0.5 évalue déjà à un bool, ce qui est encore plus rapide !

32 votes

random() >= 0.5 sinon vous serez un peu biaisé par les faux.

29 votes

random() < 0.5 Cela a plus de sens car changer 0,5 par une autre probabilité fonctionne comme prévu.

13voto

Chris Points 12438

Si vous souhaitez générer un certain nombre de booléens aléatoires, vous pouvez utiliser le module random de numpy. De la documentation

np.random.randint(2, size=10)

retournera 10 entiers uniformes aléatoires dans l'intervalle ouvert [0,2). Le site size Le mot clé spécifie le nombre de valeurs à générer.

0 votes

J'étais curieux de savoir comment la vitesse de cette méthode se comportait par rapport aux réponses puisque cette option n'était pas prise en compte dans les comparaisons. Pour générer un bool aléatoire (ce qui est la question), cette méthode est beaucoup plus lente, mais si vous voulez en générer plusieurs, cette méthode est beaucoup plus rapide : $ python -m timeit -s "from random import random" "random() < 0.5" 10000000 boucles, best of 3 : 0.0906 usec per loop

13voto

Maarten Points 468

J'aime

 np.random.rand() > .5

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X