def choose_weighted(self, *weighted_choices): choices, weights = zip(*weighted_choices) cumdist = list(itertools.accumulate(weights)) x = self.random() * cumdist[-1] return choices[bisect.bisect(cumdist, x)]