Pick items from list with probability based upon property of list member ?
southof40
shearichard at gmail.com
Mon Jun 21 06:01:41 EDT 2010
On Jun 20, 11:27 pm, Mel <mwil... at the-wire.com> wrote:
> southof40 wrote:
> > I have list of of N Vehicle objects - the only possible vehicles are
> > cars, bikes, trucks.
>
> > I want to select an object from the list with a probability of : cars
> > 0.7, bikes 0.3, trucks 0.1.
>
> > I've currently implemented this by creating another list in which each
> > car object from the original list appears 7 times, each bike 3 times
> > and each truck once. I then pick at random from that list.
>
> This seems about right. It's like a lottery where the more likely
> winners have more tickets, but all tickets are the same. Pick one to
> pick the winner.
>
> There's a very expensive, but flexible technique that effectively gives
> some tickets a better chance than others. You have to examine each
> ticket individually, so this algorithm burns random numbers like
> kindling:
>
> import random
>
> #===============================
> def weighted_choice (candidates, weight):
> chosen = None
> total = 0
> for c in candidates:
> w = weight (c)
> total += w
> if random.randint (0, total-1) < w:
> chosen = c
> return chosen
> #===============================
>
> def test_weight (c):
> return {'c':7, 'b':3, 't':1}[c]
>
> def item_count (s, target):
> return sum (1 for x in s if x==target)
>
> test_candidates = 'c'*100 + 'b'*100 + 't'*100
>
> for i in xrange (10):
> test = [weighted_choice (test_candidates, test_weight) for k in xrange (100)]
> for x in 'cbt':
> print x, item_count (test, x), '\t',
> print
>
> Mel.
I like this - makes altering the probabilities straightforward and
this is something I may want to do.
More information about the Python-list
mailing list