Juha-Matti Santala

# Random number chosen by fair dice roll

Batteries included is a blog series about the Python Standard Library. Each day, I share insights, ideas and examples for different parts of the library. Blaugust is an annual blogging festival in August where the goal is to write a blog post every day of the month.

Most of the time we want the program do what we tell it to do. (and when they don’t, Syntax Error newsletter exists to help you)

However, sometimes a bit of surprise is nice and that’s when we tell the computer to give us something specific randomly. Python’s random module offers tooling to generate pseudo-random numbers.

A note from the documentation:

Warning

The pseudo-random generators of this module should not be used for security purposes. For security or cryptographic uses, see the secrets module.

## Simulating dice

Random module is handy if we’re for example simulating a die:

``````import random

def roll_d6():
# returns a random int between 1 and 6
return random.randint(1, 6)

def roll_d20():
# for the DnD players reading
return random.randint(1, 20)

print(roll_d6())
print(roll_d6())
print(roll_d20())``````

## Random selection

When you want to pick one or more random items from a sequence like list, `random` offers a few methods for that:

``````import random

vowels = ['a', 'e', 'i', 'o', 'u']

# Returns one of the 5 vowels
random.choice(vowels)

# Select 3 vowels (repeats are allowed)
random.choices(vowels, k=3)

# Define different weights (probabilities)
random.choices(vowels, weights=[40, 15, 15, 15, 15], k=3)

# Select 3 vowels (no repeats)
random.sample(vowels, k=3)``````

## Defining determinism

Randomness can make testing the program difficult because the outcome can always be different from one run to another. When using `random`, you can define a seed which makes all the subsequent random rolls deterministic:

``````import random

random.seed(101010)
print(random.randint(1, 10)) # 8
print(random.randint(1, 10)) # 1
print(random.randint(1, 10)) # 2
print(random.randint(1, 10)) # 6``````

This way, you can use randomness in your application but set the seed at the beginning of tests and then test your other logic knowing the results of random values..

The title of the post is a homage to the classic xkcd comic Random Number. Image shared in accordance with the Creative Commons Attribution-NonCommercial 2.5 License.