wake-up-neo.com

Ein zufälliges Boolean in Python erhalten?

Ich suche den besten Weg (schnell und elegant), um einen zufälligen Boolean in Python zu erhalten (eine Münze werfen).

Im Moment verwende ich random.randint(0, 1) oder random.getrandbits(1).

Gibt es bessere Entscheidungen, die mir nicht bewusst sind?

173
Xavier V.

Adams Antwort ist ziemlich schnell, aber ich fand, dass random.getrandbits(1) viel schneller ist. Wenn Sie wirklich einen Boolean statt eines langen wollen, dann

bool(random.getrandbits(1))

ist immer noch etwa doppelt so schnell wie random.choice([True, False])

Beide Lösungen müssen import random

Wenn äußerste Geschwindigkeit nicht Priorität hat, liest random.choice definitiv besser

$ 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

Dies wurde hinzugefügt, nachdem @ Pavel's Antwort gesehen wurde

$ 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])

würde auch funktionieren.

146
Adam Vandenberg

Eine schnellere Methode gefunden:

$ 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

Wenn Sie mehrere zufällige Boolesche generieren möchten, können Sie das Zufallsmodul von numpy verwenden. Aus der Dokumentation

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

gibt 10 zufällige einheitliche Ganzzahlen im offenen Intervall zurück [0,2]. Das Schlüsselwort size gibt die Anzahl der zu generierenden Werte an.

5
Chris

Ich mag

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

Ich war neugierig, wie die Geschwindigkeit der numpy-Antwort gegen die anderen Antworten ausfiel, da dies bei den Vergleichen nicht berücksichtigt wurde. Um einen zufälligen Bool zu erzeugen, ist dies viel langsamer, aber wenn Sie viele generieren möchten, wird dies viel schneller:

$ 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