我正在寻找在Python中获取随机布尔值(像掷硬币一样)的最佳方法(快速且简洁)。
目前我使用的是 random.randint(0, 1)
或 random.getrandbits(1)
。
是否有更好的选择我不知道呢?
Adam的答案非常快,但我发现random.getrandbits(1)
要快得多。如果您真的想要一个布尔值而不是一个长整型,则
import random
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
更快 ;) - Michał Bentkowskifrom random import getrandbits
来避免属性查找,从而进一步加快速度。 :-) - kindallrandom() < 0.5
最快的原因。当使用 from random import getrandbits
时,getrandbits
比 random() < 0.5
更快。 - jl005import random
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
的运算结果已经是bool类型,速度更快! - John La Rooyrandom() >= 0.5
,否则你会稍微偏向 False
。 - Simon Lindholmrandom() < 0.5
中的0.5改为其他概率值,可以按预期运作。 - akxlrrandom() < 0.5
,感谢 @SimonLindholm 和 @akxlr。 - Pavel Radchenko我喜欢
np.random.rand() > .5
np.random.randint(2, size=10)
将在开区间 [0,2) 中返回 10 个随机均匀整数。关键字 size
指定要生成的值的数量。
>>> from faker import Faker
>>> fake = Faker()
>>> fake.pybool()
True
我好奇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
你可以尝试这个方法,它会生成一个随机数组,其中包含 true 和 false:
a=[bool(i) for i in np.array(np.random.randint(0,2,10))]
输出结果是:[True, True, True, True, True, False, True, False, True, False]
这个问题的新解决方法涉及使用 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()
语法干净易懂,其他人也很容易理解。 - Jason McVettaimport random
random.choice([0, 1])
或者
import random
random.choice(range(2))