440,649 Members | 2,142 Online Need help? Post your question and get tips & solutions from a community of 440,649 IT Pros & Developers. It's quick & easy.

# Beginners Query - Simple counter problem

 P: n/a I am brand new to Python (this is my second day), and the only experience I have with programming was with VBA. Anyway, I'm posting this to see if anyone would be kind enough to help me with this (I suspect, very easy to solve) query. The following code is in a file which I am running through the interpreter with the execfile command, yet it yeilds no results. I appreciate I am obviously doing something really stupid here, but I can't find it. Any help appreciated. def d6(i): roll = 0 count = 0 while count <= i: roll = roll + random.randint(1,6) count += 1 return roll print d6(3) Sep 6 '07 #1
8 Replies

 P: n/a David Barr wrote: I am brand new to Python (this is my second day), and the only experience I have with programming was with VBA. Anyway, I'm posting this to see if anyone would be kind enough to help me with this (I suspect, very easy to solve) query. The following code is in a file which I am running through the interpreter with the execfile command, yet it yeilds no results. I appreciate I am obviously doing something really stupid here, but I can't find it. Any help appreciated. def d6(i): roll = 0 count = 0 while count <= i: roll = roll + random.randint(1,6) count += 1 return roll print d6(3) A) your direct answer: by using <=, you are rolling 4 dice, not 3. B) Much more pythonic: import random def d6(count): result = 0 for die in range(count): result += random.randint(1, 6) return result -Scott David Daniels Sc***********@Acm.Org Sep 6 '07 #2

 P: n/a On Thu, 2007-09-06 at 11:00 -0700, Scott David Daniels wrote: def d6(count): result = 0 for die in range(count): result += random.randint(1, 6) return result This, of course, can be further improved into: def d6(count): return sum(random.randint(1, 6) for die in range(count)) -- Carsten Haese http://informixdb.sourceforge.net Sep 6 '07 #3

 P: n/a Carsten Haese wrote: On Thu, 2007-09-06 at 11:00 -0700, Scott David Daniels wrote: >def d6(count): result = 0 for die in range(count): result += random.randint(1, 6) return result This, of course, can be further improved into: def d6(count): return sum(random.randint(1, 6) for die in range(count)) My stab at it: >>def roll(times=1, sides=6): ... return random.randint(times, times*sides) Ian Sep 6 '07 #4

 P: n/a On Thu, 2007-09-06 at 11:24 -0700, Ian Clark wrote: Carsten Haese wrote: def d6(count): return sum(random.randint(1, 6) for die in range(count)) My stab at it: >>def roll(times=1, sides=6): ... return random.randint(times, times*sides) That produces an entirely different probability distribution if times>1. Consider times=2, sides=6. Your example will produce every number between 2 and 12 uniformly with the same probability, 1 in 11. When rolling two six-sided dice, the results are not evenly distributed. E.g. the probability of getting a 2 is only 1 in 36, but the probability of getting a 7 is 1 in 6. -- Carsten Haese http://informixdb.sourceforge.net Sep 6 '07 #5

 P: n/a Carsten Haese wrote: On Thu, 2007-09-06 at 11:24 -0700, Ian Clark wrote: >Carsten Haese wrote: >>def d6(count): return sum(random.randint(1, 6) for die in range(count)) My stab at it: > >>def roll(times=1, sides=6): ... return random.randint(times, times*sides) That produces an entirely different probability distribution if times>1. Consider times=2, sides=6. Your example will produce every number between 2 and 12 uniformly with the same probability, 1 in 11. When rolling two six-sided dice, the results are not evenly distributed. E.g. the probability of getting a 2 is only 1 in 36, but the probability of getting a 7 is 1 in 6. Doh. I stand corrected. Probability was never a fun subject for me. :) Ian Sep 6 '07 #6

 P: n/a Scott David Daniels wrote: David Barr wrote: >I am brand new to Python (this is my second day), and the onlyexperience I have with programming was with VBA. Anyway, I'm postingthis to see if anyone would be kind enough to help me with this (Isuspect, very easy to solve) query.The following code is in a file which I am running through theinterpreter with the execfile command, yet it yeilds no results. Iappreciate I am obviously doing something really stupid here, but Ican't find it. Any help appreciated. def d6(i): roll = 0 count = 0 while count <= i: roll = roll + random.randint(1,6) count += 1 return rollprint d6(3) A) your direct answer: by using <=, you are rolling 4 dice, not 3. B) Much more pythonic: import random def d6(count): result = 0 for die in range(count): result += random.randint(1, 6) return result -Scott David Daniels Sc***********@Acm.Org I was surprised by the speed and number of posts. Thanks for the solutions provided! >>def roll(times=1, sides=6): .... return random.randint(times, times*sides) Although this would probably be quicker than the other approaches, I'm not using the dice to generate numbers per say, I actually want to emulate the rolling of dice, bell-curve (normal distribution) as well as the range. Thanks again, I already like what (very) little I can do in Python and it seems to have a great community too. Cheers, Dave. Sep 6 '07 #7

 P: n/a On Sep 6, 10:29 am, David Barr

 P: n/a On Sep 6, 1:44 pm, Carsten Haese >def roll(times=1, sides=6): ... return random.randint(times, times*sides) That produces an entirely different probability distribution if times>1. Consider times=2, sides=6. Your example will produce every number between 2 and 12 uniformly with the same probability, 1 in 11. When rolling two six-sided dice, the results are not evenly distributed. E.g. the probability of getting a 2 is only 1 in 36, but the probability of getting a 7 is 1 in 6. -- Carsten Haesehttp://informixdb.sourceforge.net Why settle for a normal distribution? import random def devildice(dice): return sum([random.choice(die) for die in dice]) hist = {} for n in xrange(10000): the_key = devildice([[1,2,3,10,11,12],[4,5,6,7,8,9]]) if the_key in hist: hist[the_key] += 1 else: hist[the_key] = 1 hkey = hist.keys() m = max(hkey) n = min(hkey) histogram = [(i,hist.get(i,0)) for i in xrange(n,m+1)] for h in histogram: print '%3d %s' % (h,'*'*(h/100)) ## 5 ** ## 6 ***** ## 7 ******** ## 8 ******** ## 9 ******** ## 10 ******* ## 11 ***** ## 12 ** ## 13 ## 14 ** ## 15 ****** ## 16 ******** ## 17 ******** ## 18 ******** ## 19 ******** ## 20 ***** ## 21 ** They're called Devil Dice because the mean is 13 even though you cannot roll a 13. Sep 6 '07 #9

### This discussion thread is closed

Replies have been disabled for this discussion. 