Beginners Query - Simple counter problem

Discussion in 'Python' started by David Barr, Sep 6, 2007.

  1. David Barr

    David Barr Guest

    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)
     
    David Barr, Sep 6, 2007
    #1
    1. Advertising

  2. 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
     
    Scott David Daniels, Sep 6, 2007
    #2
    1. Advertising

  3. 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
     
    Carsten Haese, Sep 6, 2007
    #3
  4. David Barr

    Ian Clark Guest

    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
     
    Ian Clark, Sep 6, 2007
    #4
  5. 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
     
    Carsten Haese, Sep 6, 2007
    #5
  6. David Barr

    Ian Clark Guest

    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
     
    Ian Clark, Sep 6, 2007
    #6
  7. David Barr

    David Barr Guest

    Scott David Daniels wrote:
    > 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
    >


    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.
     
    David Barr, Sep 6, 2007
    #7
  8. David Barr

    Zentrader Guest

    On Sep 6, 10:29 am, David Barr <> wrote:
    > yields no results.


    Since every response so far has answered everything __Except The
    Question You Asked__, your code runs fine on my Linux machine and
    prints 15. The error may be before this bit of code so it isn't
    getting called. Add some print statements and try again

    def d6(i):
    print "start of d6()"
    roll = 0
    count = 0
    while count <= i:
    print "d6 count =", count, "of", i
    roll = roll + random.randint(1,6)
    count += 1

    print "returning roll =", roll
    return roll

    print d6(3)
     
    Zentrader, Sep 7, 2007
    #8
  9. David Barr

    Guest

    On Sep 6, 1:44 pm, 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.
    >
    > --
    > 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[0],'*'*(h[1]/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 7, 2007
    #9
  10. On Thu, 06 Sep 2007 18:29:32 +0100, David Barr
    <> declaimed the following in
    comp.lang.python:

    > 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.
    >

    Many responses on coding the d6 function... But I have to ask: WHY
    are you using execfile!
    --
    Wulfraed Dennis Lee Bieber KD6MOG

    HTTP://wlfraed.home.netcom.com/
    (Bestiaria Support Staff: )
    HTTP://www.bestiaria.com/
     
    Dennis Lee Bieber, Sep 7, 2007
    #10
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. The Eeediot
    Replies:
    3
    Views:
    2,261
    =?Utf-8?B?UnVsaW4gSG9uZw==?=
    Dec 22, 2004
  2. George2
    Replies:
    1
    Views:
    820
    Alf P. Steinbach
    Jan 31, 2008
  3. Maxim
    Replies:
    7
    Views:
    781
    Maxim
    Mar 9, 2010
  4. Beginners Query

    , May 11, 2005, in forum: Perl Misc
    Replies:
    1
    Views:
    78
    Tintin
    May 12, 2005
  5. K. Frank
    Replies:
    37
    Views:
    239
    Rosario193
    Jun 4, 2014
Loading...

Share This Page