# 4.4 Random-Number Generation¶

- Can introduce the element of chance via the Python Standard Library’s `random` module.

### Rolling a Six-Sided Die¶

- Product 10 random integers in the range 1–6 to simulate rolling a six-sided die:

In [1]:

    import random

In [2]:

    for roll in range(10):
        print(random.randrange(1, 7), end=' ')

    6 2 3 5 6 5 1 1 3 2

- `randrange` function generates an integer from the first argument value up to, but not including, the second argument value.
- Different values are displayed if you re-execute the loop.

In [3]:

    for roll in range(10):
        print(random.randrange(1, 7), end=' ')

    3 3 4 2 6 2 4 3 5 6

- Can guarantee reproducibility of a random sequence with the `random` module’s `seed` function.

### Rolling a Six-Sided Die 6,000,000 Times¶

- If `randrange` truly produces integers at random, every number in its range has an equal probability (or chance or likelihood) of being returned each time we call it.
- Roll a die 6,000,000 times.
- Each die face should occur approximately 1,000,000 times.
- We used Python’s underscore (_) digit separator to make the value 6000000 more readable.

    ### Rolling a Six-Sided Die 6,000,000 Times

    # fig04_01.py
    """Roll a six-sided die 6,000,000 times."""
    import random

    # face frequency counters
    frequency1 = 0
    frequency2 = 0
    frequency3 = 0
    frequency4 = 0
    frequency5 = 0
    frequency6 = 0

    # 6,000,000 die rolls
    for roll in range(6_000_000):  # note underscore separators
        face = random.randrange(1, 7)

        # increment appropriate face counter
        if face == 1:
            frequency1 += 1
        elif face == 2:
            frequency2 += 1
        elif face == 3:
            frequency3 += 1
        elif face == 4:
            frequency4 += 1
        elif face == 5:
            frequency5 += 1
        elif face == 6:
            frequency6 += 1

    print(f'Face{"Frequency":>13}')
    print(f'{1:>4}{frequency1:>13}')
    print(f'{2:>4}{frequency2:>13}')
    print(f'{3:>4}{frequency3:>13}')
    print(f'{4:>4}{frequency4:>13}')
    print(f'{5:>4}{frequency5:>13}')
    print(f'{6:>4}{frequency6:>13}')

In [4]:

    run fig04_01.py

    Face    Frequency
       1      1000562
       2       999042
       3       999988
       4      1000966
       5       999281
       6      1000161

### Seeding the Random-Number Generator for Reproducibility¶

- Function `randrange` generates pseudorandom numbers.
- Numbers appear to be random, because each time you start a new interactive session or execute a script that uses the random module’s functions, Python internally uses a different seed value.
- When you’re debugging logic errors in programs that use randomly generated data, it can be helpful to use the same sequence of random numbers.
- To do this, use the random module’s `seed` function to seed the random-number generator:

In [5]:

    random.seed(32)

In [6]:

    for roll in range(10):
        print(random.randrange(1, 7), end=' ')

    1 2 2 3 6 2 4 1 6 1

In [7]:

    for roll in range(10):
        print(random.randrange(1, 7), end=' ')

    1 3 5 3 1 5 6 4 3 5

In [8]:

    random.seed(32)

In [9]:

    for roll in range(10):
        print(random.randrange(1, 7), end=' ')

    1 2 2 3 6 2 4 1 6 1

©1992–2020 by Pearson Education, Inc. All Rights Reserved. This content is based on Chapter 4 of the book Intro to Python for Computer Science and Data Science: Learning to Program with AI, Big Data and the Cloud.

DISCLAIMER: The authors and publisher of this book have used their best efforts in preparing the book. These efforts include the development, research, and testing of the theories and programs to determine their effectiveness. The authors and publisher make no warranty of any kind, expressed or implied, with regard to these programs or to the documentation contained in these books. The authors and publisher shall not be liable in any event for incidental or consequential damages in connection with, or arising out of, the furnishing, performance, or use of these programs.