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


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


Одно из распространенных применений этой методики — выбор случайного элемента массива:

$elt = $array[ rand ©array ];

Также она часто используется для генерации случайного пароля из заданной последовательности символов:

@chars = ( "А" .. 7", "а" .. "г", 0 .. 9, qw(% ! @ $%"&*)); Spassword = jom("", @chars[ map { rand @chars } ( 1 .. 8 ) ]);

Мы генерируем восемь случайных индексов @chars с помощью функции тар, из­влекаем соответствующие символы в виде среза и объединяем их в случайный пароль. Впрочем, в действительности пароль получается не совсем случайным — безопасность вашей системы зависит от стартового значения (seed) генератора случайных чисел на момент запуска программы. В рецепте 2.8 показано, как «рас­крутить» генератор случайных чисел и сделать генерируемые числа более слу­чайными.


2.8. Раскрутка генератора случайных чисел   77

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

Описание функций int, rand и join Bperlfunc(l). Случайные числа исследуют­ся в рецептах 2.8—2.10, а используются — в рецепте 1.9.

2.8. Раскрутка генератора случайных чисел

Проблема

При каждом запуске программы вы получаете один и тот же набор «случай­ных» чисел. Требуется «раскрутить» генератор, чтобы Perl каждый раз генериро­вал разные числа. Это важно практически для любых применений случайных чи­сел, особенно для игр.

Решение

Воспользуйтесь функцией Perl srand: srand EXPR;

Комментарий

Генерация случайных чисел — непростое дело. Лучшее, на что способен компью­тер без специального оборудования, — генерация псевдослучайных чисел, равно­мерно распределенных в области своих значений. Псевдослучайные числа ге­нерируются по математическим формулам, а это означает, что при одинаковом стартовом значении генератора две программы сгенерируют одни и те же псевдо­случайные числа.

Функция srand задает новое стартовое значение для генератора псевдослу­чайных чисел. Если она вызывается с аргументом, то указанное число будет использовано в качестве стартового. При отсутствии аргумента srand исполь­зует величину, значение которой трудно предсказать заранее (относится к Perl 5.004 и более поздним версиям; до этого использовалась функция time, значе­ния которой совсем не были случайными). Не вызывайте srand в программе более одного раза.




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



Книжный магазин