[Tutor] Filling an array - with a twist
Alan Gauld
alan.gauld at yahoo.co.uk
Wed Nov 11 04:45:19 EST 2020
On 11/11/2020 06:30, Phil wrote:
> I'd like to fill an 8 x 8 array (list of lists) with random numbers such
> that no column or row repeats the same number more than twice in a sequence.
>
> e.g.. [12344562] is OK but [12223456] is not wanted.
You might need to write it out longhand with a function that
tracks the previous 2 results. There was a recent thread
discussing ways to do this (One of Manprits I think?)
> To add to the complication I really need numbers between 0 and 6 which
> random.sample() won't allow because, as the value error states, the
> sample is larger than the population.
Depending on what you need it for you could try generating smaller
lists then concatenating them. So for 8 items generate 2 lists
of 4 using sample. In the general case create n=(N/6)+1 lists each
of length N/n. Or just slice the final list to length N.
But that may not meet your definition of random...
Much slower is the manual method:
Lst = []
while len(Lst) < N:
item = randint(1,6)
if item == Lst[-1] and item == Lst[-2]:
continue
else: Lst.append(item)
But that only addresses a single row.
Checking that columns don't repeat is a whole extra level
of complexity! You need a nested loop and check the current
index against the previous two rows at the same position.
I'd definitely hide that in a function...
def validate(item, row, index, theList)
--
Alan G
Author of the Learn to Program web site
http://www.alan-g.me.uk/
http://www.amazon.com/author/alan_gauld
Follow my photo-blog on Flickr at:
http://www.flickr.com/photos/alangauldphotos
More information about the Tutor
mailing list