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=1000000 > it might be clearer to do prizes = [0,0,1,4,15,450,1000000] > 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 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 > >
_______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor