In [20]:
%matplotlib inline

import random
import itertools
import bisect

import numpy as np
import matplotlib.pyplot as plt

weights = [0.2, 0.5, 0.3]
cumdist = list(itertools.accumulate(weights))

samples = []
for i in range(1000):
    x = random.random() * cumdist[-1]
    k = bisect.bisect(cumdist, x)
    samples.append(k)
    
plt.hist(samples)


Out[20]:
(array([ 222.,    0.,    0.,    0.,    0.,  468.,    0.,    0.,    0.,  310.]),
 array([ 0. ,  0.2,  0.4,  0.6,  0.8,  1. ,  1.2,  1.4,  1.6,  1.8,  2. ]),
 <a list of 10 Patch objects>)