在python中获取随机布尔值?

Posted

技术标签:

【中文标题】在python中获取随机布尔值?【英文标题】:Get a random boolean in python? 【发布时间】:2011-10-13 01:44:41 【问题描述】:

我正在寻找在 python 中获得随机布尔值的最佳方法(快速而优雅)(掷硬币)。

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

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

【问题讨论】:

这是一个很好且有效的问题,关于获取随机布尔值的各种选项的性能,但我觉得迷失在所有基准测试的噪音中的是,表现最好的人节省不到一秒钟的时间在百万次迭代中表现最差。如果您来这里是为了寻找加速应用程序的方法,您可能应该先看看其他选项。 【参考方案1】:
import random
random.choice([True, False])

也可以。

【讨论】:

我需要导入一些库吗? 只是random。 It is part of the standard library 确实——这里的大多数其他答案都使用了相同的random【参考方案2】:

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

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

【讨论】:

如果我们只关注性能,not not random.getrandbits(1))bool 快;) 您可能根本不需要转换为布尔值,因为 0/1 具有正确的真值。 您可以通过 from random import getrandbits 进一步加快它的速度,以避免属性查找。 :-) 实际上,缺少属性查找似乎是random() &lt; 0.5 最快的原因。使用from random import getrandbitsgetrandbitsrandom() &lt; 0.5快。【参考方案3】:

找到更快的方法:

$ 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() &gt; 0.5 已经评估为更快的布尔值! random() &gt;= 0.5,否则你会有点偏向False。 random() &lt; 0.5 更有意义,因为将 0.5 更改为其他一些概率按预期工作 已更改为random() &lt; 0.5,感谢@SimonLindholm 和@akxlr。【参考方案4】:

你可以试试这个,它会产生随机生成的真假数组:

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

出:[真、真、真、真、真、假、真、假、真、假]

【讨论】:

【参考方案5】:

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

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

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

【讨论】:

【参考方案6】:

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

$ 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

【讨论】:

【参考方案7】:

这个问题的新方法是使用 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)

【讨论】:

您至少应该解释一下为什么您认为这是一个更好的解决方案,因为它涉及下载不同的包并且比较麻烦。 我不同意反对票。如果您正在创建随机数据,那么您很可能会遇到 Faker 是一个非常有用的工具的情况。 fake.boolean() 语法简洁明了,易于其他人理解。 不管这个包是否有用,完全没有解释为什么要考虑这个问题,这使得答案毫无用处。【参考方案8】:

我喜欢

 np.random.rand() > .5

【讨论】:

【参考方案9】:

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

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

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

【讨论】:

我很好奇这种方法的速度对答案的执行情况,因为这个选项被排除在比较之外。要生成一个随机布尔值(这是问题),这要慢得多,但如果你想生成很多,那么这会更快: $ python -m timeit -s "from random import random" "random()

以上是关于在python中获取随机布尔值?的主要内容,如果未能解决你的问题,请参考以下文章

在性能方面,生成随机布尔值的最佳方法是啥?

如果列表包含布尔值,如何从列表中获取整数的索引?

生成随机布尔值的最快方法

具有权重或偏差的随机布尔值

如何在 sql server 2008 中生成随机布尔值?

根据某些标准生成部分随机布尔值数组[关闭]