Возврат случайного значения из массива с вероятностью, пропорциональной его значению

У меня есть массив вроде

$keywords = array('apple'=>10,'orange'=>2,'grape'=>12); 

Я хочу случайным образом выбрать один из «ключей» из массива. Однако распределение вероятности должно быть таким, чтобы вероятность выбора элемента была пропорциональна его значению.

Related of "Возврат случайного значения из массива с вероятностью, пропорциональной его значению"

Добавьте все значения (10 + 2 + 12 – 24); получить случайное число в диапазоне [0, 24] и выбрать соответствующий элемент в зависимости от того, находится ли оно в [0, 10], [10, 12] или [12, 24].

Я бы сделал это так:

  $probabilities = array('apple'=>50, 'orange'=>20, 'banana'=>10); function random_probability($probabilities) { $rand = rand(0, array_sum($probabilities)); do { $sum = array_sum($probabilities); if($rand <= $sum && $rand >= $sum - end($probabilities)) { return key($probabilities); } } while(array_pop($probabilities)); } 

Подход O (log (n)) (это разорвано непосредственно из ответа на очень похожий вопрос ):

Обычным методом является преобразование массива в массив суммарных сумм:

  [10 60 5 25] --> [10 70 75 100] 

Выберите случайное число в диапазоне от нуля до суммарного итога (в примере: 0 <= x < 100 ). Затем используйте разбивку по кумулятивному массиву, чтобы найти индекс в исходном массиве:

 Random variable x Index in the Cumulative Array Value in Original Array ----------------- ----------------------------- ---------------------- 0 <= x < 10 0 10 10 <= x < 70 1 60 70 <= x < 75 2 5 75 <= x < 100 3 25 

Например, если случайная переменная x равна 4, то деление пополам кумулятивного массива дает индекс позиции 0, который соответствует 10 в исходном массиве.

И, если случайная переменная x равна 72, деление пополам кумулятивной матрицы дает индекс позиции 2, который соответствует 5 в исходном массиве.