如何在Python中获取随机布尔值?
我在寻找一种最好的方法(快速又优雅)来在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