Функция rand() в Perl

В языке программирования Perl есть встроенная функция rand(). Эта функция используется для получения случайного числа.

Вот пример:

▶ Run
#!/usr/bin/perl

print rand(10);

Эта программа выведет на экран случайное число от 0 (включительно) до 10 (но не включая число 10).

Например, результатом работы этой программы может быть число 2.61509101678715.

Ограничение

Функция rand() возвращает псевдослучайное число. В некоторых ситуация при некоторых условиях можно предсказать какое значение вернет функция rand(). Из этого следует что эта функция не является криптографически стойкой. Эту функцию не стоит использовать в криптографии, но для получения какого-то случайного значения вне области криптографии эта функция прекрасно подходит.

Аргументы

my $value1 = rand();
my $value2 = rand($number);

Функцию rand() можно использовать без аргументов, либо передать ей ровно один аргумент. Функция ожидает получить число в качестве значения аргумента. Если функция получает не число, то она приводит его к числу.

Использование одного аргумента

При использовании положительного числа в качестве аргумента функция rand() возвращает число больше или равное 0 и строго меньше своего аргумента. Например, если использовать 100 в качестве аргумента, можно получить число 72.9877832186506 как результат работы функции rand().

Можно использовать дробные аргументы. Если указать rand(1.5), то результат будет число больше или равное 0 и строго меньше 1.5.

При использовании отрицательного числа в качестве аргумента функция возвращает число которое строго больше указанного аргумента и меньше или равно 0.

Использование без аргументов

Использование функции rand() без аргументов это то же самое что использовать ее с аргументом 1. Функция rand() вернет число которое больше или равно 0 и строго меньше 1, например 0.813735968739824.

▶ Run
#!/usr/bin/perl

print rand(1);

Обратите внимание, если не указать аргумент, то аргументом будет число 1, а не значение дефолтной переменной $_. Если необходимо использовать $_ в качестве значения rand(), то это нужно написать явно:

▶ Run
#!/usr/bin/perl

$_ = 3;

print rand($_);

0 в качестве значения аргумента

Число 0 в качестве значения аргумента функции rand() это специальный случай. rand(0) — это то же самое что rand(1). Функция вернет число больше или равное 0 и строго меньше 1.

Использование более одного аргумента

Если передать функции rand() более чем один аргумент, то будет ошибка:

Too many arguments for rand at script.pl line 3, near "2)"
Execution of script.pl aborted due to compilation errors.

Официальная документация

Вот вывод команды perldoc -f rand:

       rand EXPR
       rand    Returns a random fractional number greater than or equal to 0
               and less than the value of EXPR.  (EXPR should be positive.)
               If EXPR is omitted, the value 1 is used.  Currently EXPR with
               the value 0 is also special-cased as 1 (this was undocumented
               before Perl 5.8.0 and is subject to change in future versions
               of Perl).  Automatically calls "srand" unless "srand" has
               already been called.  See also "srand".

               Apply "int()" to the value returned by "rand()" if you want
               random integers instead of random fractional numbers.  For
               example,

                   int(rand(10))

               returns a random integer between 0 and 9, inclusive.

               (Note: If your rand function consistently returns numbers that
               are too large or too small, then your version of Perl was
               probably compiled with the wrong number of RANDBITS.)

               "rand()" is not cryptographically secure.  You should not rely
               on it in security-sensitive situations.  As of this writing, a
               number of third-party CPAN modules offer random number
               generators intended by their authors to be cryptographically
               secure, including: Data::Entropy, Crypt::Random,
               Math::Random::Secure, and Math::TrulyRandom.

Другие статьи

Комментарии