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

Задача
Необходимо генерировать случайные числа, но с некоторым смещением, чтобы в определенном диапазоне числа появлялись чаще, чем в других. Например, нужно показать серию копий рекламных баннеров пропорционально количеству оставшихся копий каждой рекламной компании.

Решение
Используйте функцию pc_rand_weighted(), показанную в примере 2.1.

// возвращает взвешенный случайно выбранный ключ
function pc_rand_weighted($numbers) {
    $total = 0;
    foreach ($numbers as $number => $weight) {
        $total += $weight;
        $distribution[$number] = $total;
    }
    $rand = mt_rand(0, $total - 1);
    foreach ($distribution as $number => $weights) {
        if ($rand < $weights) { return $number; }
    }
}


Обсуждение
Представьте, что вместо массива, значения элементов которого отражают количество оставшихся копий объявлений, есть массив объявлений, в котором каждое объявление встречается ровно столько раз, сколько осталось его копий. Можно просто указать на не взвешенное случайное место внутри массива, и это будет реклама для показа. Вместо этого можно определить величину возможного массива (путем подсчета остающихся копий), выбрать случайное число из диапазона размера воображаемого массива, а затем пробежаться по массиву, определяя, какое объявление соответствует выбранному числу.

Например:
$ads = array('ford' => 12234, // рекламодатель, остающиеся копии
             'att'  => 33424,
             'ibm'  => 16823);
$ad = pc_rand_weighted($ads);
Теги:
rand
Добавлено: 13 Июля 2018 08:31:16 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...