BYU logo Computer Science

To start this guide, download this zip file.

Random

Sometimes we want to be able to introduce randomness into a program. For example, if you are writing a game, you may need to have a treasure or a monster appear at random times in the game. If you are writing a password manager, you may want to create random passwords.

Python has a random module that you can import with import random.

Random choice

Look at the code in choice.py. To choose a random item from a list, use random.choice():

import random


if __name__ == '__main__':
    fruits = ['pear','mango','banana','strawberry','kumquat']
    selection = random.choice(fruits)
    print(selection)

This will choose a random fruit from the list.

Random integer

Look at the code in integer.py. To choose a random integer between (and including) a low value and a high value, use random.randint():

import random


if __name__ == '__main__':
    number = random.randint(1, 10)
    print(number)

Random float

Look at the code in float.py. To choose a random float between (and including) 0 and 1, use random.random():

import random


if __name__ == '__main__':
    number = random.random()
    print(number)

If you want to scale this to be between 0 and some larger number, you can scale it with multiplication. For example, to choose a float between 0 and 100:

import random


if __name__ == '__main__':
    number = random.random() * 100

This is particularly useful for doing something with a random probability. For example, if you want your code to do something 20% of the time (or 1 in 5 chances), then:

import random


if __name__ == '__main__':
    number = random.random()
    if number <= 0.2:
        print("This should print one in 5 times.")
    else:
        print("This should print 4 in 5 times.")

You can find a more complete example in fruits.py:

import random


def apples(size: int) -> list[str]:
    """
    Collect a list of 'apples', but 10% of the time, an item is 'bananas!' instead.
    """
    result = []
    while len(result) < size:
        if random.random() < 0.1:
            result.append('bananas!')
        else:
            result.append('apples')
    return result


if __name__ == '__main__':
    fruits = apples(40)
    print(fruits)

This will set fruits to be a list of mostly apples but 10% of the time bananas! (more or less, depending on how the random numbers come up).

Random sample

Look at the code in washington.py. To sample letters from a string, use random.sample():

import random


if __name__ == '__main__':
    name = 'Washington'
    letter = random.sample(name, 2)
    print(letter)

This will return a list that has two random letters from Washington — removing each letter as it is chosen. This means at most you can choose 10 letters from Washington, with no repeats. If you chose to sample all 10 letters, you would end up with Washington scrambled.

The code in shuffle.py has a function that does exactly this:

import random

def shuffle(string: str) -> str:
    """
    Use random.sample to get the letters in the string in a random order.
    Then join the letters together with the empty string.
    """
    shuffled_letters = random.sample(string, len(string))
    return ''.join(shuffled_letters)


if __name__ == '__main__':
    shuffled = shuffle('Washington')
    print(shuffled)

Example

Write a function that will randomly inject “umm” into a sentence at a frequency of about 20%:

def ummify(text):
    """
    Randomly inject 'umm' into the given text at a frequence of 20%
    """

Here is how you might write out an algorithm to solve this problem in English:

  • create a new, empty list — result
  • loop through all of the words in the input string
    • generate a random float
    • if the float is less than or equal to 0.2, then append umm to the result list
    • append the current word to the result list
  • convert the list of words back into a string
  • return the new string

The file in ummify.py has a solution that follows this algorithm:

import random

def ummify(text: str) -> str:
    """
    Randomly inject 'umm' into the given text at a frequence of 20%
    """
    words = text.split(' ')
    result = []
    for word in words:
        if random.random() < 0.2:
            result.append('umm')
        result.append(word)
    return ' '.join(result)


if __name__ == '__main__':
    speech = ["Four score and seven years ago our fathers brought forth, on this continent, a new nation, conceived in Liberty, and dedicated to the proposition that all men are created equal.",
    "Now we are engaged in a great civil war, testing whether that nation, or any nation so conceived and so dedicated, can long endure. We are met on a great battle-field of that war.",
    "We have come to dedicate a portion of that field, as a final resting place for those who here gave their lives that that nation might live. It is altogether fitting and proper that we should do this."]

    for line in speech:
        print(ummify(line))