Respostas:
A resposta de Adam é bastante rápida, mas eu achei random.getrandbits(1)
muito mais rápido. Se você realmente quer um booleano em vez de um longo,
bool(random.getrandbits(1))
ainda é duas vezes mais rápido que random.choice([True, False])
Ambas as soluções precisam import random
Se a velocidade máxima não é prioritária, então random.choice
definitivamente é melhor ler
$ 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
Adicionado este após ver a resposta de @ Pavel
$ 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
para evitar a pesquisa de atributo. :-)
random.choice([True, False])
também funcionaria.
Encontrou um método mais rápido:
$ 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
já avalia para um bool que é ainda mais rápido!
random() >= 0.5
, caso contrário, você será um pouco inclinado para False.
random() < 0.5
faz mais sentido como mudar 0,5 a algumas outras obras de probabilidade como esperado
Se você deseja gerar um número aleatório de booleanos, pode usar o módulo aleatório do numpy. A partir da documentação
np.random.randint(2, size=10)
retornará 10 inteiros uniformes aleatórios no intervalo aberto [0,2). A size
palavra-chave especifica o número de valores a serem gerados.
Fiquei curioso para saber como a velocidade da resposta entorpecida se compara às outras respostas, uma vez que isso foi deixado de fora das comparações. Para gerar um bool aleatório, isso é muito mais lento, mas se você quiser gerar muitos, isso se torna muito mais rápido:
$ 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
Você pode usar a biblioteca Faker , que é usada principalmente para testes, mas é capaz de fornecer uma variedade de dados falsos.
Instale: https://pypi.org/project/Faker/
>>> from faker import Faker
>>> fake = Faker()
>>> fake.pybool()
True
Uma nova visão sobre essa questão envolveria o uso do Faker, com o qual você pode instalar facilmente 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()
sintaxe é limpa e fácil para os outros entenderem.
not not random.getrandbits(1))
é mais rápido do quebool
;)