Получить случайное логическое значение в python?

Я ищу лучший способ (быстрый и элегантный), чтобы получить случайное логическое значение в python (перевернуть монету).

На данный момент я использую random.randint(0, 1) или random.getrandbits(1).

Есть ли лучшие варианты, о которых я не знаю?

Ответ 1

Ответ Адама довольно быстрый, но я обнаружил, что random.getrandbits(1) будет намного быстрее. Если вы действительно хотите логическое, а не длинное, то

bool(random.getrandbits(1))

все еще примерно в два раза быстрее, чем random.choice([True, False])

Оба решения должны import random

Если максимальная скорость не относится к приоритету, тогда random.choice определенно лучше читается

$ 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

Добавлено это после просмотра ответа @Pavel

$ python -m timeit -s "from random import random" "random() < 0.5"
10000000 loops, best of 3: 0.115 usec per loop

Ответ 2

random.choice([True, False])

также будет работать.

Ответ 3

Найден более быстрый метод:

$ 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

Ответ 4

Если вы хотите сгенерировать несколько случайных логических значений, вы можете использовать случайный модуль numpy. Из документации

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

вернет 10 случайных равномерных целых чисел в открытый интервал [0,2). Ключевое слово size задает количество генерируемых значений.

Ответ 5

Мне нравится

 np.random.rand() > .5

Ответ 6

Новый подход к этому вопросу будет включать использование Faker, которое можно легко установить с помощью 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)