Получить результат, основанный на распределении вероятностей

В браузере у нас есть предметы, которые происходят на основе их вероятностей.

P (i1) = 0,8

P (i2) = 0,45

P (i3) = 0,33

P (i4) = 0,01

Как мы реализуем функцию в php, которая возвращает случайный элемент, основанный на вероятности вероятности?

редактировать

Элементы имеют свойство, называемое редкостью, которое варьируется от 1 до 100 и представляет вероятность возникновения окклюзии. Элемент, который встречается, выбирается из набора всех элементов определенного типа. (например, приведенный выше пример представляет все артефакты уровня 1)

Related of "Получить результат, основанный на распределении вероятностей"

Я не знаю, было ли это лучшим решением, но когда мне пришлось это решить некоторое время назад, это то, что я нашел:

Функция, взятая из этого сообщения в блоге :

// Given an array of values, and weights for those values (any positive int) // it will select a value randomly as often as the given weight allows. // for example: // values(A, B, C, D) // weights(30, 50, 100, 25) // Given these values C should come out twice as often as B, and 4 times as often as D. function weighted_random($values, $weights){ $count = count($values); $i = 0; $n = 0; $num = mt_rand(0, array_sum($weights)); while($i < $count){ $n += $weights[$i]; if($n >= $num){ break; } $i++; } return $values[$i]; } 

Пример вызова:

 $values = array('A','B','C'); $weights = array(1,50,100); $weighted_value = weighted_random($values, $weights); 

Это несколько громоздко, так как очевидно, что значения и весы должны поставляться отдельно, но это, вероятно, может быть реорганизовано в соответствии с вашими потребностями.

Пытался понять, как работает Bulk, и вот как я понимаю, основываясь на Benjamin Kloster:

https://softwareengineering.stackexchange.com/questions/150616/return-random-list-item-by-its-weight

Создайте случайное число n в диапазоне от 0 до суммы (весов), в этом случае $ num так скажем из этого: вес (30, 50, 100, 25).

Сумма составляет 205.

Теперь $ num должно быть 0-30, чтобы получить A,

30-80 для получения B

80-180 для получения C

и 180-205, чтобы получить D

В то время как петля находит, в каком интервале падает $ num.