在python中获取随机布尔值?

在python中获取随机布尔值?,python,random,Python,Random,我正在寻找在python中获得随机布尔值(掷硬币)的最佳方法(快速而优雅) 目前我使用的是random.randint(0,1)或random.getrandbits(1) 有没有我不知道的更好的选择 random.choice([True, False]) 这也行。亚当的答案相当快,但我发现random.getrandbits(1)要快得多。如果你真的想要一个布尔值而不是一个长的 bool(random.getrandbits(1)) 速度仍然是随机的两倍。选择([True,False])

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

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

有没有我不知道的更好的选择

random.choice([True, False])

这也行。

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

bool(random.getrandbits(1))
速度仍然是随机的两倍。选择([True,False])

两种解决方案都需要导入随机

如果最高速度不是优先考虑的,那么
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
$python-m timeit-s“来自随机导入随机”“随机()<0.5”
10000000个循环,最好3个:每个循环0.115 usec

如果要生成大量随机布尔值,可以使用numpy的随机模块。从

将在开放区间[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
$python-m timeit-s“从随机导入getrandbits”而不是getrandbits(1)
10000000个循环,最好为3个:每个循环0.222 usec
$python-m timeit-s“从随机导入随机”“如果随机()>0.5,则为True,否则为False”
10000000个循环,最好3个:每个循环0.0786 usec
$python-m timeit-s“从随机导入随机”“随机()<0.5”
10000000个循环,最佳3个:每个循环0.0579 usec

关于这个问题的一个新观点是使用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)

我很好奇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
$python-m timeit-s“来自随机导入随机”“随机()<0.5”
10000000个循环,最好3个:每个循环0.0906 usec
$python-m timeit-s“将numpy作为np导入”“np.random.randint(2,size=1)”
100000个循环,最好3个:每个循环4.65 usec
$python-m timeit-s“从随机导入随机”测试=[random()<0.5,对于范围(1000000)内的i)
10个循环,最好为3:118毫秒/循环
$python-m timeit-s“将numpy作为np导入”test=np.random.randint(2,size=1000000)
100次循环,最佳3次:每个循环6.31毫秒
您可以使用,它主要用于测试,但能够提供各种虚假数据

安装:


你可以尝试这样做,它会随机生成一个true和false数组:

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


out:[真,真,真,真,假,真,假,假,假]

如果我们都关注性能,
不是随机的。getrandbits(1))
bool
;)更快)您甚至可能根本不需要强制转换为布尔值,因为0/1具有正确的真值。您可以通过从随机导入getrandbits执行
来进一步加快速度,以避免属性查找。:-)实际上,缺少属性查找似乎是
随机()<0.5
是最快的。当使用从随机导入的
时,getrandbits
getrandbits
random()<0.5
random()>0.5
更快!否则您将有一点点偏向于False。
random()<0.5
更有意义,因为将0.5更改为其他概率的效果与预期的一样更改为
random()<0.5
,谢谢@SimonLindholm和@akxlr。你至少应该解释一下为什么你认为这是一个更好的解决方案,因为它需要下载一个不同的软件包,而且更麻烦。我不同意反对票。如果你创建的是随机数据,你很可能会遇到伪造者是一个非常有用的工具的情况。
fake.boolean()语法是干净的,很容易让别人摸索。不管包是否有用,完全不需要解释为什么要考虑这个问题使得答案无用。我很好奇这个方法对答案执行的速度,因为这个选项被排除在比较之外。bool(这是个问题)这要慢得多,但如果您想生成多个,那么这会快得多:$python-m timeit-s“from random import random”“random()<0.5”10000000个循环,最好的3:0.0906 usec/循环这是一个关于获取随机布尔值的各种选项的性能的好问题,但我感觉迷失在所有基准测试的噪音中的是这样一个事实:在一百万次迭代中,最好的执行者比最差的执行者节省不到一秒钟对于加速应用程序的方法,您可能应该首先查看其他选项。
$ 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
>>> from faker import Faker
>>> fake = Faker()
>>> fake.pybool()
True