Допустим у нас есть 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%, то первый цикл в функции не нужен.