在python中得到一个随机布尔值?

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

目前我使用的是random.randint(0, 1)random.getrandbits(1)

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

259820 次浏览
import random
random.choice([True, False])

也会起作用。

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

bool(random.getrandbits(1))

仍然是random.choice([True, False])的两倍

两个解决方案都需要import random

如果最高速度不是优先级,那么random.choice肯定读起来更好。

注意,由于属性查找,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

如果你想生成一些随机布尔值,你可以使用numpy的random模块。从文档

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

将在开放区间[0,2)中返回10个随机统一整数。size关键字指定要生成的值的数量。

我喜欢

 np.random.rand() > .5

找到了一个更快的方法:

$ 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

对这个问题的一个新的看法是使用骗子,你可以用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)

我很好奇numpy答案的速度与其他答案相比表现如何,因为这被排除在比较之外。生成一个随机bool值会慢得多,但如果你想生成多个则会快得多:

$ 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

你可以使用摊贩图书馆,它主要用于测试,但能够提供各种假数据。

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

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

你可以试试这个,它会随机生成true和false的数组:

a=[bool(i) for i in np.array(np.random.randint(0,2,10))]

出来:[真,真,真,真,真,假,真,假,真,假]

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

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

import random
random.choice(range(2))