如何在Python中获取随机布尔值?

372 投票
10 回答
307767 浏览
提问于 2025-04-16 22:15

我在寻找一种最好的方法(快速又优雅)来在Python中生成一个随机的布尔值(就像抛硬币一样)。

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

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

10 个回答

55

找到了一个更快的方法:

$ 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
276
import random
random.choice([True, False])

这也可以用。

501

亚当的回答速度挺快的,但我发现用 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

撰写回答