在python中获取随机布尔值?


244

我正在寻找最好的方法(快速而优雅)来获取python中的随机布尔值(翻转硬币)。

目前,我正在使用random.randint(0, 1)random.getrandbits(1)

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

Answers:


332

亚当的答案相当快,但是我发现答案random.getrandbits(1)要快得多。如果您真的想要布尔值而不是long值,那么

bool(random.getrandbits(1))

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

两种解决方案都需要 import random

如果最大的速度不是优先考虑的话,那么random.choice绝对可以读得更好

$ python -m timeit -s "import random" "random.choice([True, False])"
1000000 loops, best of 3: 0.904 usec per loop
$ python -m timeit -s "import random" "random.choice((True, False))" 
1000000 loops, best of 3: 0.846 usec per loop
$ python -m timeit -s "import random" "random.getrandbits(1)"
1000000 loops, best of 3: 0.286 usec per loop
$ python -m timeit -s "import random" "bool(random.getrandbits(1))"
1000000 loops, best of 3: 0.441 usec per loop
$ python -m timeit -s "import random" "not random.getrandbits(1)"
1000000 loops, best of 3: 0.308 usec per loop
$ python -m timeit -s "from random import getrandbits" "not getrandbits(1)"
1000000 loops, best of 3: 0.262 usec per loop  # not takes about 20us of this

在看到@Pavel的答案后添加了此内容

$ python -m timeit -s "from random import random" "random() < 0.5"
10000000 loops, best of 3: 0.115 usec per loop

14
如果我们只关注性能,那not not random.getrandbits(1))它会比bool;)还快
MichałBentkowski

11
您可能甚至根本不需要强制转换为布尔值,因为0/1具有正确的真值。
亚当·范登堡

6
您可以通过from random import getrandbits避免属性查找来进一步加快速度。:-)
kindall 2011年


40

找到了更快的方法:

$ 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

3
random() > 0.5已经评估为布尔值,甚至更快!
John La Rooy 2014年

26
random() >= 0.5,否则您将对False有一点偏见。
西蒙·林德霍尔姆

17
random() < 0.5更有意义的是预期变化0.5其他一些可能性的作品
akxlr


8

如果要生成许多随机布尔值,可以使用numpy的random模块。从文档中

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

将在开放时间间隔[0,2)中返回10个随机一致整数。所述size关键字指定的值的数目,以产生。


我很好奇这种方法的速度与答案之间的关系,因为在比较中没有考虑此选项。要生成一个随机布尔值(这是个问题),这要慢得多,但是如果要生成多个布尔值,则它的速度要快得多:$ python -m timeit -s“来自随机导入随机”“ random()<0.5” 10000000循环,最好的3:每个循环
0.0906 usc

2

我很想知道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


0

有关此问题的新观点将涉及使用Faker,您可以轻松地使用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)

14
考虑到它涉及下载一个不同的软件包并且比较麻烦,您至少应该解释为什么您认为这是一个更好的解决方案。
Bzazz

2
我不同意那些赞成票。如果要创建随机数据,则很可能Faker是非常有用的工具。该fake.boolean()语法是干净的,很容易让别人神交。
杰森·麦克维塔

3
不管包装是否有用,对于为什么要考虑这一点的完全缺乏解释使答案毫无用处。
Apollys支持Monica
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.