我正在寻找最好的方法(快速和优雅)在python中获得一个随机布尔值(抛硬币)。

目前我使用的是随机。Randint(0,1)或random.getrandbits(1)。

还有我不知道的更好的选择吗?


当前回答

Adam的回答相当快,但我发现random.getrandbits(1)要快得多。如果你真的想要一个布尔型而不是long型,那么

bool(random.getrandbits(1))

仍然是随机速度的两倍。选择([真,假)

两个解决方案都需要导入random

如果速度不优先,那就随机选择。选择肯定读起来更好。

注意,由于属性查找,random.choice()比choice()慢(在from random import choice之后)。

$ python3 --version
Python 3.9.7
$ python3 -m timeit -s "from random import choice" "choice([True, False])"
1000000 loops, best of 5: 376 nsec per loop
$ python3 -m timeit -s "from random import choice" "choice((True, False))"
1000000 loops, best of 5: 352 nsec per loop
$ python3 -m timeit -s "from random import getrandbits" "getrandbits(1)"
10000000 loops, best of 5: 33.7 nsec per loop
$ python3 -m timeit -s "from random import getrandbits" "bool(getrandbits(1))"
5000000 loops, best of 5: 89.5 nsec per loop
$ python3 -m timeit -s "from random import getrandbits" "not getrandbits(1)"
5000000 loops, best of 5: 46.3 nsec per loop
$ python3 -m timeit -s "from random import random" "random() < 0.5"
5000000 loops, best of 5: 46.4 nsec per loop

其他回答

对这个问题的一个新的看法是使用Faker,您可以通过pip轻松安装Faker。

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)

Adam的回答相当快,但我发现random.getrandbits(1)要快得多。如果你真的想要一个布尔型而不是long型,那么

bool(random.getrandbits(1))

仍然是随机速度的两倍。选择([真,假)

两个解决方案都需要导入random

如果速度不优先,那就随机选择。选择肯定读起来更好。

注意,由于属性查找,random.choice()比choice()慢(在from random import choice之后)。

$ python3 --version
Python 3.9.7
$ python3 -m timeit -s "from random import choice" "choice([True, False])"
1000000 loops, best of 5: 376 nsec per loop
$ python3 -m timeit -s "from random import choice" "choice((True, False))"
1000000 loops, best of 5: 352 nsec per loop
$ python3 -m timeit -s "from random import getrandbits" "getrandbits(1)"
10000000 loops, best of 5: 33.7 nsec per loop
$ python3 -m timeit -s "from random import getrandbits" "bool(getrandbits(1))"
5000000 loops, best of 5: 89.5 nsec per loop
$ python3 -m timeit -s "from random import getrandbits" "not getrandbits(1)"
5000000 loops, best of 5: 46.3 nsec per loop
$ python3 -m timeit -s "from random import random" "random() < 0.5"
5000000 loops, best of 5: 46.4 nsec per loop

我喜欢

 np.random.rand() > .5

你可以使用Faker库,它主要用于测试,但能够提供各种虚假数据。

安装:https://pypi.org/project/Faker/

>>> from faker import Faker
>>> fake = Faker()
>>> fake.pybool()
True

以下方法也可用于此目的:

import random
random.choice([0, 1])

or

import random
random.choice(range(2))