Генерация смещенных случайных чисел

Допустим у нас есть 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% оставшихся показов, а десятый баннер мы уже почти открутили — поэтому первый баннер нужно показывать на порядок чаще (см. пример выше).

#1

Если условиться заранее что сумма вероятностей 100%, то первый цикл в функции не нужен.

Сергей, 13.01.2011 - 00:29
Оставить комментарий