# Exercise #17: Dice Roll

rollDice(1)   6

This exercise uses Python’s random number generating functions to simulate rolling any number of six-sided dice and returning the total sum of the dice roll. This exercise covers random number generation with Python’s random module.

Exercise Description

Write a `rollDice()` function with a numberOfDice parameter that represents the number of six-sided dice. The function returns the sum of all of the dice rolls. For this exercise you must import Python’s `random` module to call its `random.randint()` function for this exercise.

These Python `assert` statements stop the program if their condition is `False`. Copy them to the bottom of your solution program. Your solution is correct if the following `assert` statements’ conditions are all True. We can’t predict `rollDice()`’s random return value, but we can do repeated checks that the return value is within the correct range of expected values:

assert rollDice(0) == 0

assert rollDice(1000) != rollDice(1000)

for i in range(1000):

assert 1 <= rollDice(1) <= 6

assert 2 <= rollDice(2) <= 12

assert 3 <= rollDice(3) <= 18

assert 100 <= rollDice(100) <= 600

There is an astronomically small chance that the assert rollDice(1000) != rollDice(1000) will fail with a false positive. This assertion tests that `rollDice()` doesn’t simply return the same “random” number each time by simulating rolling 1,000 dice twice and making sure the totals are different for both rolls. But, of course, there is a chance they’ll come up the same total and cause an AssertionError. In that case, just rerun the assertion tests. After all, what are the odds of that happening twice?

Try to write a solution based on the information in this description. If you still have trouble solving this exercise, read the Solution Design and Special Cases and Gotchas sections for additional hints.

Prerequisite concepts: `import` statements, `random` module, `randint()`, `for` loops, `range()`, augmented assignment operator

Solution Design

First, create a variable to track the running total of the dice rolls and start it with the value `0`. Then make a for loop to loop the same number of times as the numberOfDice parameter. Inside the loop, call the random.randint() function to return a random number between `1` and `6` and add this number to the running total. After the loop completes, return the total.

If you don’t know how the `random.randint()` function works, you can run `import random` and help(random.randint) in the interactive shell to view its documentation. Or you can do an internet search for “python randint” to find information about the function online.

Special Cases and Gotchas

There are no special cases for this exercise, but remember that Python’s `random.randint()` function is inclusive of its arguments. Calling, for example, `range(6)` causes a `for` loop to loop from `0` up to, but not including, `6`. But calling random.randint(1, 6) returns a random number between 1 and `6`, including the 1 and the `6`. If you roll three 6-sided dice, the range is from 3 to 18, not 1 to 18.

Rolling multiple dice doesn’t produce a uniform distribution: rolling two 6-sided dice is much more likely to come up with 7 because there are more combinations that add up to 7 (1 + 6, 2 + 5, 3 + 4, 4 + 3, 5 + 2, and 6 + 1) compared with rolling 2 (1 and 1 only). This is why you would need to call `random.randint(1, 6)` twice and add the rolls together instead of call `random.randint(2, 12)` once.

Your solution program needs `import random` at the top of the program in order to call the `random.randint()` function, or else you’ll get a NameError: name 'random' is not defined error message.)

Now try to write a solution based on the information in the previous sections. If you still have trouble solving this exercise, read the Solution Template section for additional hints.

Solution Template

Try to first write a solution from scratch. But if you have difficulty, you can use the following partial program as a starting place. Copy the following code from https://invpy.com/rolldice-template.py and paste it into your code editor. Replace the underscores with code to make a working program:

# Import the random module for its randint() function.

____ random

def rollDice(numberOfDice):

# Start the sum total at 0:

total = ____

# Run a loop for each die that needs to be rolled:

for i in range(____):

# Add the amount from one 6-sided dice roll to the total:

total += random.randint(____, ____)

# Return the dice roll total: