[Tutor] help with random.randint (cont. -- now: pseudo code)

David ldl08 at gmx.net
Wed Feb 3 07:12:42 CET 2010

Hello Benno, list,

thanks for those clarifications, which, well, clarify things ;-)

This is my latest creation:

import random

def createTerms():
     terms =  []
     for i in range(2):
         terms.append(random.randint(1, 99))
     j = terms[0]
     k = terms[1]
     print "%3d\nx%2d" % (j, k)


Which works. However, it merely prints a multiplication task. Anyway, 
this was just a prelude. In the end, I want far more, namely to create, 
ask, and verify some multiplication questions. Here is my pseudo code of 
this little project:

pool = []
correct = 0
incorrect = 0

def createQuestions:
     generate all multiplication combinations possible
     append as tuple to pool
     eliminate 'mirrored doubles' (i.e. 7x12 and 12x7)
     randomize pool

def askQuestions:
     for question in pool:
         calculate solution
         take answer from user
         if user answer == solution:
             correct += 1
             remove question from pool
             incorrect += 1

def showStats:
     print number of questions asked
     print number of questions answered correctly
     print percentage of correct answers

def askFaultyAnswers:
     answer = raw_input("Try again the incorrect questions? (y/n) ")
     if answer == "y":

print "good-bye!"


I think it is sensible to

* first create all possible solutions, then
* kick out doublettes, and only then
* ask questions

I have some questions though:

Is the overall structure and flow of this program okay? What are the 
main problems you can spot immediately?

In the very end I would like to take this code as a basis for a wxPython 
program. Are there any structural requirements I am violating here?

If I want to limit the number of questions asked, say to 20, would I 
operate with slicing methods on the randomised pool?

How would you go about showing stats for the second run (i.e. the 
FaultyAnswers)? Right now I am thinking of setting the global variables 
correct and incorrect to 0 from _within_ askFaultyAnswers; then I would 
run showStats() also from _within_ askFaultyAnswers. Good idea?

Many thanks for your guidance and input!


On 03/02/10 12:25, Benno Lang wrote:
> On Wed, Feb 3, 2010 at 12:21 PM, David<ldl08 at gmx.net>  wrote:
>> Hello list,
>> I thought this was easy even for me, but I was wrong, I guess.
>> Here is what I want to do: take two random numbers between 1 and 99, and put
>> them into a list.
>> import random
>> terms =  []
>> for i in range(2):
>>         terms = random.randint(1, 99)
> All you're doing here is assigning an integer value to 'terms', twice.
> This assignment means 'terms' is no longer a list, but is now just an
> int. What you want is probably:
> terms.append (random.randint(1, 99))
>> So I tried to change line 4 to the following:
>>         terms += random.randint(1, 99)
> You can't freely mix types with python operators, i.e. a_list += an_int
> But you can use += with 2 ints or 2 lists, so you could do:
> terms += [random.randint(1, 99)]
> I think using append is much nicer though.
>> I understand this error thus: once an int has been placed into the list
>> terms, no further int can be added. But: terms is a mutable list, and NOT an
>> 'int' object!
> The int was never added to the list in the first place, because list
> += int is not something Python understands.
>> So here are my questions: what is the problem, and how can I generate two
>> random numbers and store them (preferably in a tuple)?
> I hope what I wrote above answers the first question.
> IIRC tuples are immutable, so you either to create the list first and
> then convert it to a tuple:
> terms_tuple = tuple(terms)
> Or you can create a tuple from the beginning (without a loop):
> terms_tuple = (random.randint(1, 99), random.randint(1, 99))
> HTH,
> benno

More information about the Tutor mailing list