Допустим у нас есть 10 элементов и нужно случаным образом выбрать один из них.
Обычно делается это так $i = rand(1,10); где $i — номер элемента в списке. Однако, в данном случае мы получаем выборку с равной вероятностью, т.е. элемент с номером 1 выпадет столько же раз как и элемент с номером 2 или с номером 3 (при большой выборке).
Если же нам требуется выбрать элемент 1 с вероятностью 50%, а элемент 2 с вероятностью 20% (см. массив ниже), то придется написать специальную функцию.
function getRandomValue($ver) { $total = 0; foreach ($ver as $k=>$weight) { $total += $weight; $array[$k] = $total; } $rand = rand(0, $total-1); foreach ($array as $k=>$weight) { if ($rand<$weight) return $k; } } // массив (элемент - вероятность) $rand_array = array( 1=>50, 2=>20, 3=>12, 4=>8, 5=>4, 6=>3, 7=>1, 8=>1, 9=>0.5, 10=>0.5 ); $key = getRandomValue($rand_array);
Где это может понадобиться? Во-первых для эмуляции каких-либо действий. Например, 50% пользователей просматривают 1 страницу на сайте и уходят, 20% пользователей просматривают 2 страницы и т.д. Во-вторых, это нужно для оптимизации каких-либо процессов. Например, на сайте мы крутим 10 баннеров, причем на первый баннер приходится 50% оставшихся показов, а десятый баннер мы уже почти открутили — поэтому первый баннер нужно показывать на порядок чаще (см. пример выше).
Если условиться заранее что сумма вероятностей 100%, то первый цикл в функции не нужен.