В браузере у нас есть предметы, которые происходят на основе их вероятностей.
P (i1) = 0,8
P (i2) = 0,45
P (i3) = 0,33
P (i4) = 0,01
Как мы реализуем функцию в php, которая возвращает случайный элемент, основанный на вероятности вероятности?
Элементы имеют свойство, называемое редкостью, которое варьируется от 1 до 100 и представляет вероятность возникновения окклюзии. Элемент, который встречается, выбирается из набора всех элементов определенного типа. (например, приведенный выше пример представляет все артефакты уровня 1)
Я не знаю, было ли это лучшим решением, но когда мне пришлось это решить некоторое время назад, это то, что я нашел:
Функция, взятая из этого сообщения в блоге :
// 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.