[Tutor] Need help understanding output...

Evert Rol evert.rol at gmail.com
Wed Aug 18 14:16:45 CEST 2010


On 18 Aug 2010, at 13:21 , Laurens Vets wrote:

> On 8/12/2010 1:26 AM, Steven D'Aprano wrote:
>> On Thu, 12 Aug 2010 07:04:15 am Laurens Vets wrote:
>> 
>>> I need to generate a list of 30 numbers randomly chosen from 1, 2, 3,
>>> 4, 5&  6. However, I cannot have more than 2 numbers which are the
>>> same next to each other. I came up with the following (Please ignore
>>> the fact that I'm trying to avoid an IndexError in a stupid way :)):
>> 
>> I can't possible do that! :)
>> 
>>> import random
>>> reeks = []
>>> while len(reeks)<= 1:
>>>    number = random.randrange(1, 7, 1)
>>>    reeks.append(number)
>>> 
>>> while len(reeks)<= 29:
>>>    nummer = random.randrange(1, 7, 1)
>>>    if nummer != reeks[-1] and nummer != reeks[-2]:
>>>      reeks.append(nummer)
>>> print reeks
>> 
>> This is probably a simpler way:
>> 
>> import random
>> reeks = []
>> for i in range(30):
>>     temp = [random.randint(1, 6)]
>>     while reeks[-2:-1] == reeks[-1:] == temp:
>>         # print "Triplet found:", reeks, temp
>>         temp = [random.randint(1, 6)]
>>     reeks.extend(temp)
>> 
>> print reeks
> 
> <snip>
> 
> Thank you all for your help! I've added another condition to this program, namely, in a range of 60, each 'random' number can only occur 10 times. I came up with the following:
> 
> import random
> series = []
> for i in range(60):
>  temp = [random.randint(1, 6)]
>  while series[-2:-1] == series[-1:] == temp:
>    temp = [random.randint(1, 6)]
>  while series.count(temp[0]) >= 10:
>    temp = [random.randint(1, 6)]
>  series.extend(temp)
> print series
> 
> However, this also generates gems such as:
> 
> [4, 4, 3, 6, 3, 2, 6, 3, 4, 3, 4, 1, 4, 2, 4, 3, 4, 4, 6, 2, 1, 5, 5, 6, 5, 6, 5, 6, 3, 3, 1, 6, 6, 4, 1, 5, 2, 6, 6, 4, 2, 5, 3, 1, 5, 5, 2, 1, _2_, _2_, _2_, 3, 3, 2, 1, 5, 1, 1, 5, 1]
> 
> [1, 4, 3, 1, 5, 3, 5, 1, 5, 6, 5, 3, 2, 6, 1, 4, 1, 5, 5, 2, 6, 2, 4, 1, 3, 1, 2, 1, 1, 3, 1, 6, 6, 3, 2, 3, 6, 4, 5, 6, 5, 6, 3, 6, 2, 4, 5, 3, 3, 4, 6, _4_, _4_, _4_, 5, 4, _2_, _2_, _2_, _2_]
> 
> I thought this needed to become the following:
> 
> import random
> series = []
> for i in range(60):
>  temp = [random.randint(1, 6)]
>  print "Temp", i, ":", temp
>  while series[-2:-1] == series[-1:] == series:
>    if series.count(temp[0]) >= 10:
>      temp = [random.randint(1, 6)]
>  series.extend(temp)
> print series
> 
> But this just hangs whenever the while clause matches. I'm not sure what I'm doing wrong here. I do know the random.shuffle() function, but I can't put my conditions in there.


I assume the '== series:' is a typo, and should be '== temp'. Otherwise I don't see how this matches, unless series = [] (which means the while clause always matches, right at the start. Perhaps that actually is what you're seeing?). 
That's probably the disadvantage of using a list to avoid an IndexError (sorry Steven; I would have just caught the IndexError, or have an 'if i < 2: continue' statement in there.)

As suggestion for avoiding occurrences of > 10 times: use a dict, where the random numbers become the keys and you add +1 every time to d[temp]. Checking if d[temp] > 10 is then very easy.


Cheers,

  Evert



> 
> Any push in the right direction would be greatly appreciated :)
> _______________________________________________
> Tutor maillist  -  Tutor at python.org
> To unsubscribe or change subscription options:
> http://mail.python.org/mailman/listinfo/tutor



More information about the Tutor mailing list