[Tutor] Newbie question: random.sample illusion?
Hi everybody, I'm in the process of learning Python and working my way through O'Reilly's Learning Python. As an excercise I wrote (some copy/paste as well) a small lottery program just to learn how to work with lists and dictionarys etc. The user has to enter 6 numbers from a range(1-45). The numbers are stored in a list(num_list). Then the program asks the user how many times(vDraws) he wants to play the lottery with his numbers. After entering the program draws the lottery the desired number of times and compares the winning numbers with the users numbers. Now, by accident I stumbled upon the following; if the user enters the numbers 1 to 6 as his lottery numbers he always wins! So somewhere I must have made a mistake. Could somebody have a look at the code please and tell me where I took a wrong turn? winnings=0 right2=1 right3=4 right4=15 right5=450 right6=100 user_nums=[] # empty List for numbers print Kies je nummers tussen 0 en 46 print whereat=1 listindex=0 # when 7th number is inputted loop breaks while whereat = 6: num=raw_input(Voer +str(whereat)+. Lotto nummer in: ) # check that user inputted value is not smaller than 1 or bigger than 45 # and that it is not already in user_nums if num != and len(num) != 0: if int(num) = 1 and int(num) = 45 and num not in user_nums: user_nums.append(num) whereat+=1 listindex+=1 # if above statement if false just pass and ask for the number again! else: pass print '1 trekking kost U 1 euro inzet' print vDraws = input(Hoe vaak wil je in de lotto spelen met deze nummers? :) # Create dictionary for statiscal purposes later on :-) d={1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0, 13:0, 14:0, 15:0, 16:0, 17:0, 18:0, 19:0, 20:0, 21:0, 22:0, 23:0, 24:0, 25:0, 26:0, 27:0, 28:0, 29:0, 30:0, 31:0, 32:0, 33:0, 34:0, 35:0, 36:0, 37:0, 38:0, 39:0, 40:0, 41:0, 42:0, 43:0, 44:0, 45:0} match=0 count=0 inzet=vDraws * 1 while vDraws 0: x=random.sample(range(1,46), 6)# draws lottery from given range for i in x: y=int(i) d[y] = int(d[y])+ 1 #stores values in lottonumbers dictionary for p in user_nums: count+=1 y=str(y) if p in y: match+=1 # increase matching variable by one if its right number # caculating winnings if match ==2: winnings+=right2 match=0 elif match ==3: winnings+=right3 match=0 elif match == 4: winnings+=right4 match=0 elif match == 5: winnings+=right5 match=0 elif match == 6: winnings+=right6 match=0 vDraws = vDraws - 1 # sorting dictionary by its values items=d.items() backitems=[ [v[1],v[0]] for v in items] backitems.sort() sortedlist=[ backitems[i][1] for i in range(0,len(backitems))] print print print saldo=winnings-inzet print print print '-' * 80 if saldo 0: print 'U heeft', saldo, 'euro winst gemaakt!' else: print 'U heeft', saldo, ' euro verlies geleden!' print 'U heeft in totaal gewonnen', winnings, 'euro.' print 'Uw inzet was', inzet, 'euro' print 'De 6 meest gevallen getallen waren:', for x in sortedlist[0:6]: print x, #prints the 6 most drawn numbers _ Veilig gerust mailen met de verbeterde antivirusscan van Live Mail! http://imagine-windowslive.com/mail/launch/default.aspx?Locale=nl-nl ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Newbie question: random.sample illusion?
Moedeloos Overste wrote: Hi everybody, I'm in the process of learning Python and working my way through O'Reilly's Learning Python. As an excercise I wrote (some copy/paste as well) a small lottery program just to learn how to work with lists and dictionarys etc. The user has to enter 6 numbers from a range(1-45). The numbers are stored in a list(num_list). Then the program asks the user how many times(vDraws) he wants to play the lottery with his numbers. After entering the program draws the lottery the desired number of times and compares the winning numbers with the users numbers. Now, by accident I stumbled upon the following; if the user enters the numbers 1 to 6 as his lottery numbers he always wins! So somewhere I must have made a mistake. Could somebody have a look at the code please and tell me where I took a wrong turn? winnings=0 right2=1 right3=4 right4=15 right5=450 right6=100 it might be clearer to do prizes = [0,0,1,4,15,450,100] user_nums=[] # empty List for numbers print Kies je nummers tussen 0 en 46 print whereat=1 listindex=0 What is the point of having two variables here? You never use listindex. You should start whereat at 0. # when 7th number is inputted loop breaks while whereat = 6: And loop until whereat is less than 6. That's the general consensus on looping in Computer Science. Starting at 0. num=raw_input(Voer +str(whereat)+. Lotto nummer in: ) And just change this line to str(whereat+1) instead. # check that user inputted value is not smaller than 1 or bigger than 45 # and that it is not already in user_nums if num != and len(num) != 0: If they enter 'a' your program will crash. A better solution would be to use a try except block. eg. try: tmp = int(num) if tmp = 1 and tmp = 45 and tmp not in user_nums: user_nums.append(tmp) whereat += 1 except ValueError: pass if int(num) = 1 and int(num) = 45 and num not in user_nums: user_nums.append(num) Also note here that you're using the integer representation of num to compare it to 1 and 45, but then you're storing the string representation of it in user_nums. This may be part of why you're having a problem. whereat+=1 listindex+=1 # if above statement if false just pass and ask for the number again! else: pass print '1 trekking kost U 1 euro inzet' print vDraws = input(Hoe vaak wil je in de lotto spelen met deze nummers? :) # Create dictionary for statiscal purposes later on :-) d={1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0, 13:0, 14:0, 15:0, 16:0, 17:0, 18:0, 19:0, 20:0, 21:0, 22:0, 23:0, 24:0, 25:0, 26:0, 27:0, 28:0, 29:0, 30:0, 31:0, 32:0, 33:0, 34:0, 35:0, 36:0, 37:0, 38:0, 39:0, 40:0, 41:0, 42:0, 43:0, 44:0, 45:0} This could be: d = {} for x in range(1,46): d[x] = 0 Or several varations of this, using lambda map, and such. match=0 count=0 You don't use count in your program anywhere. inzet=vDraws * 1 There's absolutely no reason to multiply something by 1. while vDraws 0: x=random.sample(range(1,46), 6)# draws lottery from given range for i in x: y=int(i) This line is unnecessary, 'i' is already an integer. d[y] = int(d[y])+ 1 #stores values in lottonumbers dictionary Can be shortened to d[y] += 1 for p in user_nums: count+=1 no reason to do this because the for loop will end when it runs out of variables. y=str(y) Again, if you leave the original items as integers you don't have to do all this conversion. if p in y: I would change this to 'if p == y', because I'm not sure what 'in' is doing here. match+=1 # increase matching variable by one if its right number # caculating winnings if match ==2: winnings+=right2 match=0 elif match ==3: winnings+=right3 match=0 elif match == 4: winnings+=right4 match=0 elif match == 5: winnings+=right5 match=0 elif match == 6: winnings+=right6 match=0 Using that prizes list, this can be shortened to winnings += prizes[match] match = 0 vDraws = vDraws - 1 Or vDraws -= 1 # sorting dictionary by its values items=d.items() backitems=[ [v[1],v[0]] for v in items] backitems.sort() sortedlist=[ backitems[i][1] for i in range(0,len(backitems))] print print print saldo=winnings-inzet print print print '-' * 80 if saldo 0: print 'U heeft', saldo, 'euro winst gemaakt!' else: print 'U heeft', saldo, ' euro verlies geleden!' print 'U heeft in totaal gewonnen', winnings, 'euro.' print 'Uw inzet was', inzet, 'euro' print 'De 6 meest gevallen getallen waren:', for x in
Re: [Tutor] Newbie question: random.sample illusion?
Moedeloos Overste wrote: Hi everybody, I'm in the process of learning Python and working my way through O'Reilly's Learning Python. As an excercise I wrote (some copy/paste as well) a small lottery program just to learn how to work with lists and dictionarys etc. The user has to enter 6 numbers from a range(1-45). The numbers are stored in a list(num_list). Then the program asks the user how many times(vDraws) he wants to play the lottery with his numbers. After entering the program draws the lottery the desired number of times and compares the winning numbers with the users numbers. Now, by accident I stumbled upon the following; if the user enters the numbers 1 to 6 as his lottery numbers he always wins! So somewhere I must have made a mistake. Could somebody have a look at the code please and tell me where I took a wrong turn? Ooops, I accidentally hit 'send' on that other e-mail before I was done with it. I was just going to say that you forgot to include 'random'. Also, here is the code with the changes I suggested. I ran it on 1,2,3,4,5,6 for 80 tries and didn't win every time. #code begins here. import random winnings=0 prizes = [0,0,1,4,15,450,100] user_nums=[] # empty List for numbers print Kies je nummers tussen 0 en 46 print whereat=0 # when 6th number is inputted loop breaks while whereat 6: num=raw_input(Voer +str(whereat+1)+. Lotto nummer in: ) # check that user inputted value is not smaller than 1 or bigger than 45 # and that it is not already in user_nums try: tmp = int(num) if tmp = 1 and tmp = 45 and tmp not in user_nums: user_nums.append(tmp) whereat += 1 except ValueError: pass print '1 trekking kost U 1 euro inzet' print vDraws = input(Hoe vaak wil je in de lotto spelen met deze nummers? :) # Create dictionary for statiscal purposes later on :-) d = {} for x in range(1,46): d[x] = 0 match=0 count=0 inzet=vDraws while vDraws 0: x=random.sample(range(1,46), 6)# draws lottery from given range for i in x: d[i] += 1 #stores values in lottonumbers dictionary for p in user_nums: if p == i: match+=1 # increase matching variable by one if its right number winnings += prizes[match] match = 0 vDraws -= 1 # sorting dictionary by its values items=d.items() backitems=[ [v[1],v[0]] for v in items] backitems.sort() sortedlist=[ backitems[i][1] for i in range(0,len(backitems))] print '\n\n' saldo=winnings-inzet print '\n' print '-' * 80 if saldo 0: print 'U heeft', saldo, 'euro winst gemaakt!' else: print 'U heeft', saldo, ' euro verlies geleden!' print 'U heeft in totaal gewonnen', winnings, 'euro.' print 'Uw inzet was', inzet, 'euro' print 'De 6 meest gevallen getallen waren:', for x in sortedlist[0:6]: print x, #prints the 6 most drawn numbers ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Newbie question: random.sample illusion?
Dear Luke, Wow, thank you for all the input.You really made an effort .It's always nice when someone is willing to share his knowledge with you. You really opened my eyes on some things. I guess it's gonna be a long night for me. But I'm really enjoying myself though :-) Regards, Robert From: Luke Paireepinart [EMAIL PROTECTED] To: Moedeloos Overste [EMAIL PROTECTED] CC: tutor@python.org Subject: Re: [Tutor] Newbie question: random.sample illusion? Date: Thu, 07 Dec 2006 12:17:23 -0600 Moedeloos Overste wrote: Hi everybody, I'm in the process of learning Python and working my way through O'Reilly's Learning Python. As an excercise I wrote (some copy/paste as well) a small lottery program just to learn how to work with lists and dictionarys etc. The user has to enter 6 numbers from a range(1-45). The numbers are stored in a list(num_list). Then the program asks the user how many times(vDraws) he wants to play the lottery with his numbers. After entering the program draws the lottery the desired number of times and compares the winning numbers with the users numbers. Now, by accident I stumbled upon the following; if the user enters the numbers 1 to 6 as his lottery numbers he always wins! So somewhere I must have made a mistake. Could somebody have a look at the code please and tell me where I took a wrong turn? winnings=0 right2=1 right3=4 right4=15 right5=450 right6=100 it might be clearer to do prizes = [0,0,1,4,15,450,100] user_nums=[] # empty List for numbers print Kies je nummers tussen 0 en 46 print whereat=1 listindex=0 What is the point of having two variables here? You never use listindex. You should start whereat at 0. # when 7th number is inputted loop breaks while whereat = 6: And loop until whereat is less than 6. That's the general consensus on looping in Computer Science. Starting at 0. num=raw_input(Voer +str(whereat)+. Lotto nummer in: ) And just change this line to str(whereat+1) instead. # check that user inputted value is not smaller than 1 or bigger than 45 # and that it is not already in user_nums if num != and len(num) != 0: If they enter 'a' your program will crash. A better solution would be to use a try except block. eg. try: tmp = int(num) if tmp = 1 and tmp = 45 and tmp not in user_nums: user_nums.append(tmp) whereat += 1 except ValueError: pass if int(num) = 1 and int(num) = 45 and num not in user_nums: user_nums.append(num) Also note here that you're using the integer representation of num to compare it to 1 and 45, but then you're storing the string representation of it in user_nums. This may be part of why you're having a problem. whereat+=1 listindex+=1 # if above statement if false just pass and ask for the number again! else: pass print '1 trekking kost U 1 euro inzet' print vDraws = input(Hoe vaak wil je in de lotto spelen met deze nummers? :) # Create dictionary for statiscal purposes later on :-) d={1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0, 13:0, 14:0, 15:0, 16:0, 17:0, 18:0, 19:0, 20:0, 21:0, 22:0, 23:0, 24:0, 25:0, 26:0, 27:0, 28:0, 29:0, 30:0, 31:0, 32:0, 33:0, 34:0, 35:0, 36:0, 37:0, 38:0, 39:0, 40:0, 41:0, 42:0, 43:0, 44:0, 45:0} This could be: d = {} for x in range(1,46): d[x] = 0 Or several varations of this, using lambda map, and such. match=0 count=0 You don't use count in your program anywhere. inzet=vDraws * 1 There's absolutely no reason to multiply something by 1. while vDraws 0: x=random.sample(range(1,46), 6)# draws lottery from given range for i in x: y=int(i) This line is unnecessary, 'i' is already an integer. d[y] = int(d[y])+ 1 #stores values in lottonumbers dictionary Can be shortened to d[y] += 1 for p in user_nums: count+=1 no reason to do this because the for loop will end when it runs out of variables. y=str(y) Again, if you leave the original items as integers you don't have to do all this conversion. if p in y: I would change this to 'if p == y', because I'm not sure what 'in' is doing here. match+=1 # increase matching variable by one if its right number # caculating winnings if match ==2: winnings+=right2 match=0 elif match ==3: winnings+=right3 match=0 elif match == 4: winnings+=right4 match=0 elif match == 5: winnings+=right5 match=0 elif match == 6: winnings+=right6 match=0 Using that prizes list, this can be shortened to winnings += prizes[match] match = 0 vDraws = vDraws - 1 Or vDraws -= 1 # sorting dictionary by its values items=d.items() backitems=[ [v[1],v[0]] for v in items] backitems.sort() sortedlist