Sum of simulation of the rolling of 2 six-sided dice with python

10.4k views Asked by At

Write a simulation of the rolling of 2 six-sided dice. Your program should have a function Roll() that returns the sum of rolling your dice. You may assume that each of the six sides is equally likely to be rolled (that is, the dice are "fair"). Run your simulation 1000 times and report the frequency that each sum occurred.

I have this so far but my program wont seem to add up the sums. I may be completely wrong. Any help please. I think my main issue is in my printing statement. I need the output to print how many times does the sum of 2 shows, sum of 3, sum of 4, etc till 12.

def Roll():
    for i in range(1000):
        one = 0
        two = 0
        three = 0
        four = 0
        five = 0
        six = 0
        dice1= float(0)
        dice2= float(0)

        dice1 = random.randint(1,6)
        if dice1 == 1:    
            one = one + 1
            count= 1
            return count
        elif dice1 == 2:
            two = two + 1
            count= 1
            return count
        elif dice1 == 3:
            three = three + 1
            count= 1
            return count
        elif dice1 == 4:
            four = four + 1
            count= 1
            return count
        elif dice1 == 5:
            five = five + 1
            count= 1
            return count
        else:
            six = six + 1
            count= 1
            return count

        dice2 = random.randint(1,6)
        if dice2 == 1:    
            one = one + 1
        elif dice2 == 2:
            two = two + 1
        elif dice2 == 3:
            three = three + 1
        elif dice2 == 4:
            four = four + 1
        elif dice2 == 5:
            five = five + 1
        else:
            six = six + 1

        total = one + two + three + four + five + six

        print("2", dice1 + dice2)   
        print("3", dice1 + dice2)
        print("4", dice1 + dice2)
        print("5", dice1 + dice2)
        print("6", dice1 + dice2)    
        print("7", dice1 + dice2)
        print("8", dice1 + dice2)   
        print("9", dice1 + dice2)
        print("10", dice1 + dice2)
        print("11", dice1 + dice2)
        print("12", dice1 + dice2)
2

There are 2 answers

3
Hyperboreus On

I already answered a friend of yours with the same assignment:

import random
from collections import defaultdict

def main():
    dice = int(input("Enter the number of dice: "))
    sides = int(input("Enter the number of sides: "))
    rolls = int(input("Enter the number of rolls to simulate: "))
    result = roll(dice, sides, rolls)
    maxH = 0
    for i in range(dice, dice * sides + 1):
        if result[i] / rolls > maxH: maxH = result[i] / rolls
    for i in range(dice, dice * sides + 1):
        print('{:2d}{:10d}{:8.2%} {}'.format(i, result[i], result[i] / rolls, '#' * int(result[i] / rolls / maxH * 40)))


def roll(dice, sides, rolls):
    d = defaultdict(int)
    for _ in range(rolls):
        d[sum(random.randint(1, sides) for _ in range(dice))] += 1
    return d

main()

You can take out the parts which are useful to you. This should also cover the follow-up questions like: "How do I print it neatly" and "How do I draw a histogram".


Example:

Enter the number of dice: 2
Enter the number of sides: 6
Enter the number of rolls to simulate: 1000
 2        28   2.80% ######
 3        59   5.90% #############
 4        84   8.40% ###################
 5        96   9.60% ######################
 6       155  15.50% ####################################
 7       170  17.00% ########################################
 8       147  14.70% ##################################
 9       102  10.20% #######################
10        80   8.00% ##################
11        50   5.00% ###########
12        29   2.90% ######
0
Chris Taylor On

Here's a quick and dirty method

from collections import Counter
import random

def roll():
  return random.randint(1,6) + random.randint(1,6)

counter = Counter( roll() for _ in range(1000) )

for num, cnt in counter.iteritems():
  print '%2d: %.3f' % (num, cnt / 1000.0)

which results in

 2: 0.022
 3: 0.063
 4: 0.072
 5: 0.104
 6: 0.154
 7: 0.174
 8: 0.141
 9: 0.112
10: 0.077
11: 0.057
12: 0.024