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

244

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

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

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

Ксавье В.
источник

Ответы:

332

Ответ Адама довольно быстрый, но я обнаружил, что 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

Добавил этот, увидев ответ @ Павла

$ python -m timeit -s "from random import random" "random() < 0.5"
10000000 loops, best of 3: 0.115 usec per loop
Джон Ла Рой
источник
14
Если мы все о производительности, not not random.getrandbits(1))быстрее, чем bool;)
Михал Бентковски
11
Скорее всего, вам даже не нужно приводить к логическому значению, поскольку 0/1 имеют правильные значения истинности.
Адам Ванденберг
6
Вы могли бы ускорить его дальше, from random import getrandbitsизбегая поиска атрибутов. :-)
11:07
186
random.choice([True, False])

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

Адам Ванденберг
источник
40

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

$ 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
Павел Радченко
источник
3
random() > 0.5уже оценивается как бул, который еще быстрее!
Джон Ла Рой
26
random() >= 0.5в противном случае вы будете слегка склонны к Ложному.
Саймон Линдхольм
17
random() < 0.5имеет больше смысла, так как изменение 0.5 на некоторую другую вероятность работает, как и ожидалось
akxlr
9

мне нравиться

 np.random.rand() > .5
Маартен
источник
8

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

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

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

Крис
источник
Мне было любопытно, как скорость этого метода работала против ответов, так как эта опция была исключена из сравнений. Чтобы сгенерировать один случайный тип bool (вопрос в этом), это намного медленнее, но если вы хотите сгенерировать много, то это происходит гораздо быстрее: $ python -m timeit -s "from random import random" "random () <0.5" 10000000 циклов лучшее из 3:
0,0906 юсек
2

Мне было любопытно, как скорость откровенного ответа шла против других ответов, так как это было исключено из сравнений. Чтобы сгенерировать один случайный бул, это намного медленнее, но если вы хотите сгенерировать много, то это станет намного быстрее

$ 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
ojunk
источник
1

Вы можете использовать библиотеку Faker , она в основном используется для тестирования, но способна предоставлять множество поддельных данных.

Установите: https://pypi.org/project/Faker/

>>> from faker import Faker
>>> fake = Faker()
>>> fake.pybool()
True
Partiban
источник
0

Новый подход к этому вопросу будет связан с использованием 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)
Althea
источник
14
Вы должны хотя бы объяснить, почему вы считаете это лучшим решением, учитывая, что оно предполагает загрузку другого пакета и является более сложным.
Bzazz
2
Я не согласен с отрицательными голосами. Если вы создаете случайные данные, вы можете оказаться в ситуации, когда Faker является очень полезным инструментом. fake.boolean()Синтаксис является чистым и легким для других обращали внимание.
Джейсон МакВетта
3
Независимо от того, является ли пакет полезным, полное отсутствие объяснения того, почему следует учитывать это, делает ответ бесполезным.
Apollys поддерживает Монику