permutations, patterns, and probability

Steven Bethard steven.bethard at gmail.com
Tue Feb 1 19:44:31 EST 2005


kpp9c wrote:
> Greetings,
> 
> I am working on a program to produce patterns. What would like is for
> it to  exhaustively produce all possible permutations of a sequence of
> items but for each permutation produce variations, and also a sort of
> stutter based on probability / weighted randomess.
> 
> Let us say we have tiles of four primary colors: ['Red', 'Blue',
> 'Green', 'Yellow']. Now we also have 4 alternatives or substitutes for
> each color ['Maroon', 'Navy_Blue', 'Forest_Green', 'Dark_Brown']
> 
> We pick a unique permutation, say: ['Red', 'Blue', 'Yellow', 'Green']
> 
> Now I would like to pick the primary colors substitute (say 30% chance
> for each element) so instead of our plain
> 
> ['Red', 'Blue', 'Yellow', 'Green']
> 
> we might end up with:
> 
> ['Red', 'Navy_Blue', 'Yellow', 'Forest_Green']
> 
> or
> 
> ['Maroon', 'Navy_Blue', 'Yellow', 'Green']
> 
> Whatever... The main point is that sometimes the original color is
> retained and sometimes the dark color is substituted.
> 
> Now I want to take this list and sometimes stutter an element so that
> there is, let us say a 50% chance for each element, that it is
> stuttered, and it may be repeated 1 (34%), 2(66%), or 3(33%) times. So
> that we could get:
> 
> ['Maroon','Maroon','Navy_Blue', 'Yellow','Yellow','Yellow','Yellow',
> 'Green']
> 
> The program would quit when all 24 (in the case of 4 elements) was
> exhausted.

Playing around with this:

py> def alt_color(color, color_map=dict(Red='Maroon',
...                                     Blue='Navy_Blue',
...                                     Yellow='Forest_Green',
...                                     Green='Dark_Brown')):
...     if random.random() <= 0.3:
...         return color_map[color]
...     return color
...
py> def reps():
...     if random.random() < 0.5:
...         return 1
...     return random.randint(2, 4)
...
py> def combinations(items, n):
...     if n==0:
...         yield []
...     else:
...         for i in xrange(len(items)):
...             item_slice = items[i:i+1]
...             for c in combinations(items[:i]+items[i+1:], n-1):
...                 yield item_slice + c
...
py> colors = ['Red', 'Blue', 'Yellow', 'Green']
py> some_colors = combinations(colors, len(colors)).next()
py> some_colors
['Red', 'Blue', 'Yellow', 'Green']
py> alt_colors = [alt_color(c) for c in some_colors]
py> alt_colors
['Red', 'Navy_Blue', 'Yellow', 'Green']
py> rep_colors = [c for color in alt_colors for c in [color]*reps()]
py> rep_colors
['Red', 'Red', 'Navy_Blue', 'Navy_Blue', 'Navy_Blue', 'Yellow', 'Green', 
'Green']

Hope some of that is helpful.

Steve



More information about the Python-list mailing list