То, что вы описываете, является многочленным процессом.
http://en.wikipedia.org/wiki/Multinomial_distribution#Sampling_from_a_multinomial_distribution
Они способ создания такого случайный процесса, как это: (я буду использовать псевдокод, но это должно быть легко сделать его к реальному коду.)
Сортировка в «коробки» в обратном порядке их вероятности: (. не нужно это просто оптимизация) так, что у вас есть, например, значений = [0.45,0.3,0.15,0.1]
затем создайте «кумулятивное» распределение, которое является суммой всех элементов с индексом < = i. псевдокод:
cumulant=[0,0,0,0] // initiate it
s=0
for j=0 to size()-1 {
s=s+values[i] ;
cumulant[i]=s
}
в нашем случае кумулянта = [0.45,0.70,0.85, 1]
сделать равномерное случайное число х между 0 и 1. Для PHP: http://php.net/manual/en/function.rand.php
полученный случайный индекс ящика i равен
самый высокий i, для которого кумулянт [i] < x
псевдокод:
for j=0 to size()-1 {
if !(cumulant[i]<){
print "your index is ",i
break;
}
, что это. Получите еще один случайный индекс i, вернувшись к пункту 3.
, если вы отсортированы как указано выше, это означает, что окончательный поиск будет быстрее. Например, если у вас есть этот вектор вероятностей: 0,001 0,001 0,001 0,001 0,996, то при сортировке вам почти всегда придется смотреть только на индекс i = 0, так как случайное число x почти всегда будет ниже 0,996 , Если сортировка рассчитывается или нет, это зависит от того, используете ли вы одни и те же «боксы». Итак, да с 250 тыс. Попыток это очень поможет. Просто помните, что индекс ящика, который вы получаете, предназначен для отсортированного вектора.
Покажите нам, что вы пробовали до сих пор. – Leigh
Мне удалось вычислить вероятности из необработанных данных. (Суммируя и вычисляя процент суммы для каждого элемента), я понятия не имею, как идти дальше отсюда. –