Odpowiedzi:
Odpowiedź Adama jest dość szybka, ale stwierdziłem, że random.getrandbits(1)
jest znacznie szybsza. Jeśli naprawdę chcesz długo boolean
bool(random.getrandbits(1))
jest nadal około dwa razy szybszy niż random.choice([True, False])
Oba rozwiązania muszą import random
Jeśli najwyższa prędkość nie jest priorytetem, to random.choice
zdecydowanie lepiej
$ 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
Dodałem ten po obejrzeniu odpowiedzi @ Pavela
$ python -m timeit -s "from random import random" "random() < 0.5"
10000000 loops, best of 3: 0.115 usec per loop
from random import getrandbits
unikając wyszukiwania atrybutów. :-)
random.choice([True, False])
też by działał.
Znaleziono szybszą metodę:
$ 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
random() > 0.5
już ocenia na bool, który jest jeszcze szybszy!
random() >= 0.5
, w przeciwnym razie będziesz trochę stronniczy w stosunku do False.
random() < 0.5
ma sens, gdy zmiana 0,5 na inne prawdopodobieństwo działa zgodnie z oczekiwaniami
Jeśli chcesz wygenerować liczbę losowych boolanów, możesz użyć losowego modułu numpy. Z dokumentacji
np.random.randint(2, size=10)
zwróci 10 losowych jednolitych liczb całkowitych w przedziale otwartym [0,2). Słowo size
kluczowe określa liczbę wartości do wygenerowania.
Byłem ciekawy, jak szybkość numpy odpowiedzi wypadła w porównaniu z innymi odpowiedziami, ponieważ nie uwzględniono tego w porównaniach. Aby wygenerować jeden losowy bool, jest to znacznie wolniejsze, ale jeśli chcesz wygenerować wiele, staje się to znacznie szybsze:
$ 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
Możesz użyć biblioteki Fakera , jest ona głównie używana do testowania, ale jest w stanie dostarczyć różnorodne fałszywe dane.
Zainstaluj: https://pypi.org/project/Faker/
>>> from faker import Faker
>>> fake = Faker()
>>> fake.pybool()
True
Nowe podejście do tego pytania wymagałoby użycia Fakera, z którym można łatwo zainstalować pip
.
from faker import Factory
#----------------------------------------------------------------------
def create_values(fake):
""""""
print fake.boolean(chance_of_getting_true=50) # True
print fake.random_int(min=0, max=1) # 1
if __name__ == "__main__":
fake = Factory.create()
create_values(fake)
fake.boolean()
Składnia jest czyste i proste, aby inni mogli grok.
not not random.getrandbits(1))
jest szybsza niżbool
;)