web-dev-qa-db-fra.com

Obtenir un booléen aléatoire en python?

Je cherche le meilleur moyen (rapide et élégant) d’obtenir un booléen aléatoire en python (lancer une pièce de monnaie).

Pour le moment, j'utilise random.randint(0, 1) ou random.getrandbits(1).

Y at-il de meilleurs choix que je ne suis pas au courant?

173
Xavier V.

La réponse d'Adam est assez rapide, mais j'ai trouvé que random.getrandbits(1) était 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 prioritaire, random.choice se lit définitivement mieux

$ python -m timeit -s "import random" "random.choice([True, False])"
1000000 loops, best of 3: 0.904 usec per loop
$ python -m timeit -s "import random" "random.choice((True, False))" 
1000000 loops, best of 3: 0.846 usec per loop
$ python -m timeit -s "import random" "random.getrandbits(1)"
1000000 loops, best of 3: 0.286 usec per loop
$ python -m timeit -s "import random" "bool(random.getrandbits(1))"
1000000 loops, best of 3: 0.441 usec per loop
$ python -m timeit -s "import random" "not random.getrandbits(1)"
1000000 loops, best of 3: 0.308 usec per loop
$ python -m timeit -s "from random import getrandbits" "not getrandbits(1)"
1000000 loops, best of 3: 0.262 usec per loop  # not takes about 20us of this

Ajouté celui-ci après avoir vu la réponse de @ Pavel

$ python -m timeit -s "from random import random" "random() < 0.5"
10000000 loops, best of 3: 0.115 usec per loop
252
John La Rooy
random.choice([True, False])

fonctionnerait aussi.

146
Adam Vandenberg

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
31
Pavel Radchenko

Si vous voulez générer un 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 mot clé size spécifie le nombre de valeurs à générer.

5
Chris

J'aime

 np.random.Rand() > .5
4
Maarten

J'étais curieux de savoir comment la rapidité de la réponse numpy fonctionnait par rapport aux autres réponses puisque celle-ci était exclue des comparaisons. Pour générer un booléen aléatoire, cela est beaucoup plus lent, mais si vous voulez en générer plusieurs, cela devient beaucoup plus rapide:

$ python -m timeit -s "from random import random" "random() < 0.5"
10000000 loops, best of 3: 0.0906 usec per loop
$ python -m timeit -s "import numpy as np" "np.random.randint(2, size=1)"
100000 loops, best of 3: 4.65 usec per loop

$ python -m timeit -s "from random import random" "test = [random() < 0.5 for i in range(1000000)]"
10 loops, best of 3: 118 msec per loop
$ python -m timeit -s "import numpy as np" "test = np.random.randint(2, size=1000000)"
100 loops, best of 3: 6.31 msec per loop
0
ojunk