Я ищу лучший способ (быстрый и элегантный), чтобы получить случайное логическое значение в python (перевернуть монету).
На данный момент я использую random.randint(0, 1)
или random.getrandbits(1)
.
Есть ли лучшие варианты, о которых я не знаю?
Я ищу лучший способ (быстрый и элегантный), чтобы получить случайное логическое значение в python (перевернуть монету).
На данный момент я использую random.randint(0, 1)
или random.getrandbits(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
random.choice([True, False])
также будет работать.
Найден более быстрый метод:
$ 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
Если вы хотите сгенерировать несколько случайных логических значений, вы можете использовать случайный модуль numpy. Из документации
np.random.randint(2, size=10)
вернет 10 случайных равномерных целых чисел в открытый интервал [0,2). Ключевое слово size
задает количество генерируемых значений.
Мне нравится
np.random.rand() > .5
Новый подход к этому вопросу будет включать использование 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)