PERL: БИБЛИОТЕКА ПРОГРАММИСТА


PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 85


Модуль Math::Random генерирует случайные числа с помощью библиотеки randlib. Кроме того, он содержит многочисленные вспомогательные функции.

О Смотри также--------------------------------------------------------------------------------------------

Описание функций srand и rand в perlfunc(l); рецепты 2.7—2.8; документация по модулям Math::Random и Math::TrulyRandom с CPAN.

2.10.  Генерация случайных чисел
с неравномерным распределением

Проблема

Требуется генерировать случайные числа в ситуации, когда одни значения по­являются с большей вероятностью, чем другие (неравномерное распределение). Допустим, вы отображаете на своей Web-странице случайный баннер и у вас име­ется набор весовых коэффициентов, определяющих частоту появления того или


2.10. Генерация случайных чисел с неравномерным распределением   79

иного баннера. А может быть, вы имитируете нормальное распределение (закон распределения Гаусса).

Решение

Если вам потребовались случайные величины, распределенные по конкретному закону (допустим, по закону Гаусса), загляните в учебник по статистике и найди­те в нем нужную функцию или алгоритм. Следующая функция генерирует случай­ные числа с нормальным распределением, со стандартным отклонением 1 и нуле­вым математическим ожиданием.

sub gaussian_rand {

my ($u1, $u2);     # Случайные числа с однородным распределением

my $w;      # Отклонение, затем весовой коэффициент

my ($g1, $g2);     # Числа с гауссовским распределением

do {

$u1 = 2 * rand() - 1;

$u2 = 2 * rand() - 1;

$w = $u1*$u1 + $u2»u2 } while ($w >= 1);

$w = sqrt( (-2 * log($w)) / $w); $g2 = $u1 * $w; $g1 = $u2 * $w;

# Возвратить оба числа или только одно return wantarray ? ($g1, $g2) : $g1; }

Если у вас есть список весовых коэффициентов и значений и вы хотите выби­рать элементы списка случайным образом, выполните два последовательных шага. Сначала превратите весовые коэффициенты в вероятностное распределение с по­мощью приведенной ниже функции weight_to_dist, а затем воспользуйтесь функ­цией weighted_rand для случайного выбора чисел.




Начало  Назад  Вперед