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

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

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

Пример 2.1. pc_rand_weighted()
// возвращает взвешенный случайно выбранный ключ
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);

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Взятие логарифмов
Вычисление степеней
Вычисление тригонометрических функций
Вычисления с не десятичными числами
Генерация случайных чисел в пределах диапазона

Вернуться в раздел: PHP / 2. Числа