Of course! In Python, there are a few excellent ways to generate a random boolean value (True or False). The most common and recommended method is using the random module.

Here’s a breakdown of the best ways to do it, from simplest to most flexible.
The Best and Most Common Method: random.choice()
This is the most readable and Pythonic way to get a random boolean. You simply choose one item from a list containing True and False.
import random
# Choose a random value from the list [True, False]
random_bool = random.choice([True, False])
print(f"A random boolean is: {random_bool}")
print(f"Another random boolean is: {random.choice([True, False])}")
Why it's great:
- Readable: The code
random.choice([True, False])clearly states its intent. - Flexible: If you ever needed to choose from more than two options, the logic remains the same.
The Efficient Method: random.getrandbits(1)
This method is slightly more performant because it doesn't involve creating a list or making a choice. It generates a random integer and checks if it's odd or even.

import random
# Generate a random integer with 1 bit (either 0 or 1)
# If the number is 0, bool(0) is False. If it's 1, bool(1) is True.
random_bool = bool(random.getrandbits(1))
print(f"A random boolean is: {random_bool}")
How it works:
random.getrandbits(1)returns a random integer that is either0or1.- In Python,
bool(0)evaluates toFalse, andbool(1)(or any non-zero number) evaluates toTrue. - This is a very common and efficient pattern in low-level programming.
The "Classic" Method: random.random() < 0.5
This method is also very common. It generates a random float between 0.0 and 1.0 and checks if it's less than 0.5. This gives you a 50/50 chance of getting True or False.
import random
# random.random() returns a float in [0.0, 1.0)
# This expression will be True roughly half the time.
random_bool = random.random() < 0.5
print(f"A random boolean is: {random_bool}")
How it works:
random.random()produces a number like123,876,5001, etc.- Since the range is from
0(inclusive) to0(exclusive), there is an equal probability of the number being in the[0.0, 0.5)range or the[0.5, 1.0)range. - Therefore, the comparison
< 0.5has a 50% chance of beingTrue.
The "Biased" Method: Weighted Choice
What if you don't want a 50/50 chance? You can use random.choices() to create a biased or weighted random boolean.
For example, let's say you want True to appear 70% of the time and False 30% of the time.
import random
# Define the choices and their corresponding weights
choices = [True, False]
weights = [70, 30] # 70% chance for True, 30% for False
# Generate a single random choice based on the weights
random_bool = random.choices(choices, weights=weights, k=1)[0]
print(f"A weighted random boolean (70% True) is: {random_bool}")
# Let's test the bias by running it many times
true_count = 0
false_count = 0
iterations = 10000
for _ in range(iterations):
if random.choices(choices, weights=weights, k=1)[0]:
true_count += 1
else:
false_count += 1
print(f"\nAfter {iterations} iterations:")
print(f"True count: {true_count} (approx. {true_count/iterations*100:.2f}%)")
print(f"False count: {false_count} (approx. {false_count/iterations*100:.2f}%)")
Summary: Which One Should You Use?
| Method | When to Use It | Pros | Cons |
|---|---|---|---|
random.choice([True, False]) |
Almost always. This is the default, best choice. | Highly readable, flexible, and clear. | Slightly less performant than getrandbits (negligible for most cases). |
bool(random.getrandbits(1)) |
In performance-critical code or low-level scenarios. | Very fast and efficient. | Less readable; the intent isn't immediately obvious. |
random.random() < 0.5 |
When you already have a random float for another purpose. |
Common pattern, easy to understand. | Involves a floating-point operation, which can be slower than integer operations. |
random.choices(...) |
When you need a biased (non-50/50) probability. | The standard way to create weighted random choices. | More complex syntax; overkill for a simple 50/50 chance. |
