Ответ @Kerrek хорош.
Но если гистограмма весов состоит не только из маленьких целых чисел, вам нужно что-то более мощное:
Разделите [0..1] на интервалы, размер которых соответствует весам. Здесь вам нужны сегменты с относительным соотношением размеров 7:6:5:4:3:2:1. Таким образом, размер одной единицы интервала равен 1/(7+6+5+4+3+2+1)=1/28, а размеры интервалов равны 7/28, 6/28, ... 1/. 28.
Они составляют распределение вероятностей, поскольку их сумма равна 1.
Теперь найдем кумулятивное распределение:
P x
7/28 => 0
13/28 => 1
18/28 => 2
22/28 => 3
25/28 => 4
27/28 => 5
28/28 => 6
Теперь сгенерируйте случайное число r
в [0..1] и найдите его в этой таблице, найдя наименьшее x
такое, что r <= P(x)
. Это случайное значение, которое вы хотите.
Поиск в таблице можно выполнить с помощью бинарного поиска, что является хорошей идеей, когда гистограмма имеет много интервалов.
Обратите внимание, что вы эффективно строите обратную кумулятивную функцию плотности, поэтому ее иногда называют методом обратных преобразований. .
person
Gene
schedule
21.10.2012