По существу, создайте массив кумулятивного распределения вероятностей (CDF). По сути, значение CDF для данного индекса равно сумме всех значений в P, равной или меньшей этого индекса. Затем вы генерируете случайное число от 0 до 1 и выполняете двоичный поиск (или, если хотите, линейный поиск). Вот простой код для этого.
from bisect import bisect
from random import random
P = [0.10,0.25,0.60,0.05]
cdf = [P[0]]
for i in xrange(1, len(P)):
cdf.append(cdf[-1] + P[i])
random_ind = bisect(cdf,random())
конечно, вы можете генерировать кучу случайных индексов с чем-то вроде
rs = [bisect(cdf, random()) for i in xrange(20)]
* 1009 получая *
[2, 2, 3, 2, 2, 1, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, 2, 2]
(результаты будут и должны отличаться). Конечно, бинарный поиск является довольно ненужным для очень небольшого числа возможных индексов, но определенно рекомендуется для распределений с большим количеством возможных индексов.