Search code examples
pythonrandom

Get a random boolean in python?


I am looking for the best way (fast and elegant) to get a random boolean in python (flip a coin).

For the moment I am using random.randint(0, 1) or random.getrandbits(1).

Are there better choices that I am not aware of?


Solution

  • Adam's answer is quite fast, but I found that random.getrandbits(1) to be quite a lot faster. If you really want a boolean instead of a long then

    import random
    bool(random.getrandbits(1))
    

    is still about twice as fast as random.choice([True, False])

    Both solutions need to import random

    If utmost speed isn't to priority then random.choice definitely reads better.

    Note that random.choice() is slower than just choice() (after from random import choice) due to the attribute lookup.

    $ 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