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

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

  3. This, of course, can be further improved into:

    def d6(count):
    return sum(random.randint(1, 6) for die in range(count))
     
    Carsten Haese, Sep 6, 2007
    #3
  4. David Barr

    Ian Clark Guest

    My stab at it:
    ... return random.randint(times, times*sides)

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

    Ian Clark Guest

    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

    I was surprised by the speed and number of posts. Thanks for the
    solutions provided!
    .... 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

    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

    mensanator Guest

    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.
     
    mensanator, Sep 7, 2007
    #9
  10. 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. Advertisements

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.