On Thu, Dec 2, 2010 at 12:41 PM, raymond.hettinger <python-checkins at python.org> wrote: > +A more general approach is to arrange the weights in a cumulative probability > +distribution with :func:`itertools.accumulate`, and then locate the random value > +with :func:`bisect.bisect`:: > + > + >>> choices, weights = zip(*weighted_choices) > + >>> cumdist = list(itertools.accumulate(weights)) > + >>> x = random.random() * cumdist[-1] > + >>> choices[bisect.bisect(cumdist, x)] > + 'Blue' Neat example, although it would be easier to follow if you broke that last line into two pieces: .>>> random_index = bisect.bisect(cumdist, x) .>>> choices[random_index] 'Blue' It took me a moment to remember how bisect.bisect worked, but it would have been instant if the return value was assigned to an appropriately named variable. Cheers, Nick. -- Nick Coghlan | ncoghlan at gmail.com | Brisbane, Australia
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4