http://eli.thegreenplace.net/2010/01/22/weighted-random-generation-in-python/
Love this fast and elegant one.
class WeightedRandomGenerator(object): def __init__(self, weights): self.totals = [] running_total = 0 for w in weights: running_total += w self.totals.append(running_total) def next(self): rnd = random.random() * self.totals[-1] return bisect.bisect_right(self.totals, rnd) def __call__(self): return self.next() 