user2328597
user2328597

Reputation: 1

Display random number frequency in python

I want to display how many times each of the possible random numbers were generated by having a symbol next to the number. But it is putting the symbols on a new line beneath the number like this:

Dice rolled:
You rolled 2 and 4

Roll again [y|n]? n

Number Frequency:
1
2
 x
3
4
 x
5
6

How could I make it display the symbol on the same line beside the number?

import random

diceCount = [0,0,0,0,0,0,0]
roll='y'

while roll=='y':
    die1=random.randint(1,6)
    die2=random.randint(1,6)
    diceCount[die1] = diceCount[die1] + 1
    diceCount[die2] = diceCount[die2] + 1

    print('Dice rolled:')
    print('You rolled',die1,'and',die2)

    if roll=='y':
        roll=input('\nRoll again [y|n]? ')
        while roll!='y' and roll!='n':
            roll=input("Please enter either 'y' or 'n': ")

if roll=='n':

        print('\nFace Freqeuncy:')
        index=1
        while (index<len(diceCount)):
            print(index)
            for number in range (diceCount[index]):
                print(' x')
            index+=1

Upvotes: 0

Views: 984

Answers (4)

Burhan Khalid
Burhan Khalid

Reputation: 174624

In addition to what Joachim posted, you can also use collections.Counter:

from collections import Counter

rolls = []
roll = 'y'

while roll=='y':
    die1=random.randint(1,6)
    die2=random.randint(1,6)
    rolls.append(die1)
    rolls.append(die2)

    print('Dice rolled:')
    print('You rolled',die1,'and',die2)

    if roll=='y':
        roll=input('\nRoll again [y|n]? ')
        while roll!='y' and roll!='n':
             roll=input("Please enter either 'y' or 'n': ")

counted_rolls = Counter(rolls)

for i range(1,7):
    print("{} {}".format(i,'x'*counted_rolls.get(i,0)))

Upvotes: 1

Inbar Rose
Inbar Rose

Reputation: 43437

Try this:

I have created a class for rolling dice, where you can customize the amount of dice in each roller and the sides, as well as keep track of rolls.

import random
from collections import defaultdict

class roller():

    def __init__(self, number_of_dice=2, dice_sides=6):

        self.dice = defaultdict(dict)
        for die in range(number_of_dice):
            self.dice[die]['sides'] = dice_sides
            self.dice[die]['count'] = dict((k,0) for k in range(1, dice_sides+1))

    def roll(self, times=1):
        print ("Rolling the Dice %d time(s):" % times)
        total = 0
        for time in range(times):
            roll_total = 0
            print ("Roll %d" % (time+1))
            for die, stats in self.dice.items():
                result = random.randint(1, stats['sides'])
                roll_total += result
                stats['count'][result] += 1
                print (" Dice %s, sides: %s, result: %s" % (die, stats['sides'], result))
            print ("Roll %d total: %s" % (time+1, roll_total))
            total += roll_total
        print ("Total result: %s" % total)


    def stats(self):
        print ("Roll Statistics:")
        for die, stats in self.dice.items():
            print (" Dice %s, sides: %s" % (die, stats['sides'])) 
            for value, count in stats['count'].items():
                print ("  %s: %s times" % (value, count))

Using it:

>>> a = roller()
>>> a.roll(4)
Rolling the Dice 4 time(s):
Roll 1
 Dice 0, sides: 6, result: 6
 Dice 1, sides: 6, result: 3
Roll 1 total: 9
Roll 2
 Dice 0, sides: 6, result: 3
 Dice 1, sides: 6, result: 3
Roll 2 total: 6
Roll 3
 Dice 0, sides: 6, result: 1
 Dice 1, sides: 6, result: 6
Roll 3 total: 7
Roll 4
 Dice 0, sides: 6, result: 5
 Dice 1, sides: 6, result: 4
Roll 4 total: 9
Total result: 31
>>> a.stats()
Roll Statistics:
 Dice 0, sides: 6
  1: 1 times
  2: 0 times
  3: 1 times
  4: 0 times
  5: 1 times
  6: 1 times
 Dice 1, sides: 6
  1: 0 times
  2: 0 times
  3: 2 times
  4: 1 times
  5: 0 times
  6: 1 times

Upvotes: 1

Joachim Isaksson
Joachim Isaksson

Reputation: 180887

In Python3, you can use the optional parameter end to remove the newline;

print(index, end="")

I'm assuming that you'll want all the x on the same line too, in that case, do the same with the print(' x', end=""); and add a newline after the loop.

Upvotes: 2

HennyH
HennyH

Reputation: 7944

You must modify your loop to have it output properly. The else clause of a for loop is visited if the loop doesn't exit prematurely.

while (index<len(diceCount)):
            print(index,end="") #let the next print appear on same line
            for number in range (diceCount[index]):
                print(' x',end="") #print the correct number of x's on the same line
            print() #we now need to print a newline
            index+=1

Examples:

Dice rolled:
You rolled 1 and 5
Roll again [y|n]? n
Face Freqeuncy:
1 x
2
3
4
5 x
6

Dice rolled:
You rolled 6 and 6
Roll again [y|n]? y
Dice rolled:
You rolled 3 and 4
Roll again [y|n]? n
Face Freqeuncy:
1
2
3 x
4 x
5
6 x x

Upvotes: 0

Related Questions