Разработчику. Сборник рецептов PHP
Задавайте вопросы

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

Вернуться назад

Задача

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

Решение

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

Пример 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);

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования


Рейтинг Сайтов ДОСКИ.РУ