Книга: Разработка приложений в среде Linux. Второе издание
19.1. Псевдослучайные числа
19.1. Псевдослучайные числа
В некоторых ситуациях все же требуется обеспечить невозможность прогнозирования. Библиотека С содержит функции для генерирования ожидаемых последовательностей псевдослучайных чисел. Эти функции легки в применении и являются одинаковыми на всех платформах Unix. Рассмотрим пример типичного использования данных функций.
#include <stdlib.h>
#include <time.h>...
srand(time(NULL) +getpid());
for (...;...;...) {
do_something(rand());
}
Общепринято в качестве начального значения для генератора псевдослучайных чисел задавать текущую дату в формате, возвращаемом функцией time()
. Последняя возвращает количество секунд, прошедших с 1 января 1970 года, поэтому начальное значение изменяется каждую секунду. Таким образом, оно может считаться уникальным в течение достаточно длинного интервала времени (приблизительно 49 710 дней на 32-разрядном компьютере). Если необходимо предотвратить возможность одинаковой активизации программы для двух пользователей, которые запускают ее в одну и ту же секунду, добавьте в начальном значении ко времени идентификатор текущего процесса.
Числа, возвращаемые функцией rand()
, удовлетворяют математическим свойствам случайного распределения, но не обладают высокой энтропией (уровнем неупорядоченности). Для достаточно больших выборок они хорошо распределены в пределах всевозможных 32-битовых чисел, однако для одного и того же начального значения можно получить различные наборы чисел. Это означает, что такие псевдослучайные числа пригодны почти для всех приложений, требующих случайного распределения чисел. К таким приложениям относятся игры, методы Монте-Карло (здесь важно сохранить начальное значение, чтобы любой желающий мог проверить ваши результаты), а также протоколы, которые обрабатывают коллизии путем ввода случайной задержки.
Обратите внимание на то, что при отладке вам потребуется сохранить начальное значение, с которым была вызвана функция srand()
. Если во время работы программы происходит ошибка, зависящая от данных, переданных функцией rand()
, то вы можете использовать это значение для вывода того же самого потока случайных чисел и воспроизведения ошибки.