for sample in sorted(random.uniform(0, T) for _ in range(n)):
    while sample > cumulative[i][0]:
        i += 1
yield cumulative[i][1]
r = list(sample_weighted([(1.0, 'a'), (2.0, 'b'), (5.0, 'c'), (1.0, 'd')], 
    10000))
print([(x, r.count(x)) for x in 'abcd'])
Python не совсем случайная выборка из списка объектов