448,507 Members | 1,185 Online Need help? Post your question and get tips & solutions from a community of 448,507 IT Pros & Developers. It's quick & easy.

# Basic coin flipper program - logical error help

 P: n/a I'm just learning Python. I've created a simple coin flipper program - here is the code: [source] #Coin flipper import random heads = 0 tails = 0 counter = 0 coin = random.randrange(2) while (counter < 100): if (coin == 0): heads += 1 counter += 1 else: tails += 1 counter += 1 coin = random.randrange(2) print "\nThe coin landed on heads", heads, "times." print "\nThe coin landed on tails", tails, "times." [/source] <<>> The program runs - however - it will give me 100 heads OR 100 tails. Can someone spot the logic error? Thanks ~Dan Feb 22 '06 #1
12 Replies

 P: n/a On Tue, 2006-02-21 at 16:14 -0800, DannyB wrote: I'm just learning Python. I've created a simple coin flipper program - here is the code: [source] #Coin flipper import random heads = 0 tails = 0 counter = 0 coin = random.randrange(2) while (counter < 100): if (coin == 0): heads += 1 counter += 1 else: tails += 1 counter += 1 coin = random.randrange(2) print "\nThe coin landed on heads", heads, "times." print "\nThe coin landed on tails", tails, "times." [/source] <<>> The program runs - however - it will give me 100 heads OR 100 tails. Can someone spot the logic error? Yes. Put coin = random.randrange(2) inside the while loop. import random heads = 0 tails = 0 counter = 0 coin = random.randrange(2) while (counter < 100): if (coin == 0): heads += 1 counter += 1 else: tails += 1 counter += 1 coin = random.randrange(2) print "\nThe coin landed on heads", heads, "times." print "\nThe coin landed on tails", tails, "times." -- This message has been scanned for viruses and dangerous content by MailScanner, and is believed to be clean. Feb 22 '06 #2

 P: n/a DannyB wrote: I'm just learning Python. I've created a simple coin flipper program - here is the code: [source] #Coin flipper import random heads = 0 tails = 0 counter = 0 while (counter < 100): coin = random.randrange(2) Claudio if (coin == 0): heads += 1 counter += 1 else: tails += 1 counter += 1 coin = random.randrange(2) print "\nThe coin landed on heads", heads, "times." print "\nThe coin landed on tails", tails, "times." [/source] <<>> The program runs - however - it will give me 100 heads OR 100 tails. Can someone spot the logic error? Thanks ~Dan Feb 22 '06 #3

 P: n/a DannyB wrote: I'm just learning Python. I've created a simple coin flipper program - here is the code: [source] #Coin flipper import random heads = 0 tails = 0 counter = 0 coin = random.randrange(2) while (counter < 100): if (coin == 0): heads += 1 counter += 1 else: tails += 1 counter += 1 coin = random.randrange(2) print "\nThe coin landed on heads", heads, "times." print "\nThe coin landed on tails", tails, "times." [/source] <<>> The program runs - however - it will give me 100 heads OR 100 tails. Can someone spot the logic error? Thanks ~Dan Looks an awful lot like your homework, but I'll give you a clue. You need to get the your coin tosses inside your loop. Otherwise you only toss the coin once and then loop 100 times with the same value. -Larry Bates Feb 22 '06 #4

 P: n/a DannyB wrote: I'm just learning Python. I've created a simple coin flipper program - here is the code: [source] #Coin flipper import random heads = 0 tails = 0 counter = 0 coin = random.randrange(2) while (counter < 100): if (coin == 0): heads += 1 counter += 1 else: tails += 1 counter += 1 coin = random.randrange(2) print "\nThe coin landed on heads", heads, "times." print "\nThe coin landed on tails", tails, "times." [/source] <<>> The program runs - however - it will give me 100 heads OR 100 tails. Can someone spot the logic error? Thanks ~Dan Dan, Looping is easier with: for x in range(100): if random.randint(0,1) == 0: heads += 1 else: tails += 1 Inside the loop you need to "flip" on each pass. You're "flipping" once before the start of the loop now. wes Feb 22 '06 #5

 P: n/a Thanks everyone for your insight. I'm coming from C++ - I'm used to formatting code with {} instead of whitespaces. @Larry - this isn't my homework :P I'm actually taking a VB.NET class in school. I was teaching myself C++ but decided to scale back to Python. I've heard it was a bit easier to understand and it cuts your development time by at least 50% (I've heard 90%). Logically I can figure things out - its the formatting of the logic in Python that is messing me up. I'll get it soon enough =) Feb 22 '06 #7

 P: n/a wes weston wrote: Looping is easier with: for x in range(100): if random.randint(0,1) == 0: heads += 1 else: tails += 1 Also, with the functional programming tools of map, filter, and lambda, this code can be reduced to just six lines: import random flips = map(lambda x: random.randrange(2), xrange(100)) heads = len(filter(lambda x: x is 0, flips)) tails = len(filter(lambda x: x is not 0, flips)) print "The coin landed on heads", heads, "times." print "The coin landed on tails", tails, "times." Feb 22 '06 #8

 P: n/a John Zenger wrote: Also, with the functional programming tools of map, filter, and lambda, this code can be reduced to just six lines: import random flips = map(lambda x: random.randrange(2), xrange(100)) heads = len(filter(lambda x: x is 0, flips)) tails = len(filter(lambda x: x is not 0, flips)) Or a filter/map/lambda free way: heads = sum(random.randrange(2) for x in xrange(100)) tails = 100 - heads Feb 22 '06 #9

 P: n/a wrote in message news:11**********************@g43g2000cwa.googlegr oups.com... John Zenger wrote: Also, with the functional programming tools of map, filter, and lambda, this code can be reduced to just six lines: import random flips = map(lambda x: random.randrange(2), xrange(100)) heads = len(filter(lambda x: x is 0, flips)) tails = len(filter(lambda x: x is not 0, flips)) Or a filter/map/lambda free way: heads = sum(random.randrange(2) for x in xrange(100)) tails = 100 - heads sort, then groupby. import itertools import random h,t = [len(list(g)) for k,g in itertools.groupby(sorted([random.randrange(2) for i in xrange(100)]))] print h,t Feb 22 '06 #10

 P: n/a wes weston wrote: DannyB wrote: I'm just learning Python. I've created a simple coin flipper program - .... Dan, Looping is easier with: for x in range(100): if random.randint(0,1) == 0: heads += 1 else: tails += 1 Or, continuing with that theme: for x in range(N): heads += random.randint(0, 1) As in: import random N = 100 heads = 0 for x in range(N): heads += random.randint(0, 1) print "%d heads and %d tails." % (heads, N - heads) Feb 22 '06 #11

 P: n/a DannyB said unto the world upon 21/02/06 06:14 PM: I'm just learning Python. I've created a simple coin flipper program - here is the code: [source] #Coin flipper import random heads = 0 tails = 0 counter = 0 coin = random.randrange(2) while (counter < 100): if (coin == 0): heads += 1 counter += 1 else: tails += 1 counter += 1 coin = random.randrange(2) The program runs - however - it will give me 100 heads OR 100 tails. Can someone spot the logic error? Your original question is long since answered. But I've a style point. As Dennis Lee Bieber pointed out, you don't need all three accumulators. If you keep to the overall style of your code, you can avoid repeating yourself as: while (counter < 100): counter += 1 # No point in putting this in each branch coin = random.randrange(2) if (coin == 0): heads += 1 else: tails += 1 For roughly the same style, I'd go with: heads = 0 count = 100 for i in range(count): if random.randrange(2): heads += 1 tails = count - heads HTH, Brian vdB Feb 22 '06 #12

 P: n/a "Paul McGuire" wrote in message news:yU******************@tornado.texas.rr.com... wrote in message news:11**********************@g43g2000cwa.googlegr oups.com... sort, then groupby. import itertools import random h,t = [len(list(g)) for k,g in itertools.groupby(sorted([random.randrange(2) for i in xrange(100)]))] print h,t By the way, sort + groupby generalizes beyond just coin-flipping. Here is a modified version that simulates die rolls. -- Paul import itertools import random NUM_ROLLS = 1000 dieRolls = [random.randrange(6)+random.randrange(6)+2 for i in xrange(NUM_ROLLS)] # create dummy list entries for impossible rolls of 0 and 1 rolls = [None,None] rolls += [len(list(g)) for k,g in itertools.groupby(sorted(dieRolls))] # print out nice histogram for i,r in enumerate(rolls): if i > 1: print "%2d - %s" % (i,"*"*int(round(r/10.0))) prints: 2 - *** 3 - ***** 4 - ********* 5 - ********** 6 - *************** 7 - ****************** 8 - ************** 9 - ********* 10 - ******* 11 - ******* 12 - *** Feb 22 '06 #13

### This discussion thread is closed

Replies have been disabled for this discussion. 