在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() < 0.5
最快的原因。使用from random import getrandbits
时getrandbits
比random() < 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() > 0.5
已经评估为更快的布尔值!
random() >= 0.5
,否则你会有点偏向False。
random() < 0.5
更有意义,因为将 0.5 更改为其他一些概率按预期工作
已更改为random() < 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中获取随机布尔值?的主要内容,如果未能解决你的问题,请参考以下文章