Я шукаю найкращий спосіб (швидкий та елегантний), щоб отримати випадкову булеву в пітоні (перевернути монету).
На даний момент я використовую random.randint(0, 1)
або random.getrandbits(1)
.
Чи є кращий вибір, про який я не знаю?
Я шукаю найкращий спосіб (швидкий та елегантний), щоб отримати випадкову булеву в пітоні (перевернути монету).
На даний момент я використовую 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
Додав цей, побачивши відповідь @ Павла
$ 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
уникаючи пошуку атрибутів. :-)
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
random() > 0.5
вже оцінює до булінгу, який ще швидше!
random() >= 0.5
, інакше ти будеш крихітним упередженим відношенням до False.
random() < 0.5
має більше сенсу, оскільки зміна 0,5 на якусь іншу ймовірність працює так, як очікувалося
Якщо ви хочете генерувати кількість випадкових булів, ви можете використовувати випадковий модуль numpy. З документації
np.random.randint(2, size=10)
поверне 10 випадкових рівномірних цілих чисел у відкритому інтервалі [0,2). У size
ключовому слові визначає число значень для генерації.
Мені було цікаво, як швидкість оніміння відповіді по відношенню до інших відповідей, оскільки це залишилося поза порівняннями. Згенерувати один випадковий буль це набагато повільніше, але якщо ви хотіли генерувати багато, то це стає набагато швидше:
$ 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
Ви можете використовувати бібліотеку Faker , вона в основному використовується для тестування, але здатна надати різні підроблені дані.
Встановити: https://pypi.org/project/Faker/
>>> from faker import Faker
>>> fake = Faker()
>>> fake.pybool()
True
Нове рішення цього питання передбачає використання 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)
fake.boolean()
Синтаксис є чистим і легким для інших звертали увагу.
not not random.getrandbits(1))
то швидше, ніжbool
;)