Статья подготовлена для студентов курса «Разработчик C++» в образовательном проекте OTUS.
Возможность генерации случайных чисел необходима для работы некоторых программ, например, игр или приложений научно-статистического моделирования. В игре без рандомных событий монстры будут атаковать вас одинаково, вы будете постоянно находить одни и те же артефакты и т. д. Именно поэтому уметь генерировать случайные числа — обязанность любого программиста.
Случайные и псевдослучайные числа. В чём разница?
В реальной жизни, чтобы получить случайный результат мы кидаем кости или тасуем колоду карт. Итог будет зависеть от множества физических переменных (силы тяжести, трения, сопротивления воздуха, мастерства игрока и т. п.). Во многих смыслах мы действительно получаем случайный результат, ведь спрогнозировать его почти невозможно.
У компьютеров всё иначе. Они находятся в строго контролируемом цифровом мире, где существуют лишь два значения: правда и ложь. Именно поэтому ПК изначально создан для получения прогнозируемого результата. Следовательно, он неспособен генерировать случайные числа в полном смысле этого слова. Однако компьютер может имитировать случайность, а достигается это путём использования генераторов псевдослучайных чисел.
Что такое генератор случайных чисел?
Генератор случайных (псевдослучайных) чисел, он же ГСЧ (ГСПЧ) — это программа, принимающая начальное значение и выполняющая с этим значением ряд математических операций, что приводит к конвертации числа в другую цифру, отличную от стартовой. После этого программа применяет новое сгенерированное значение для дальнейших математических операций с последующей генерацией очередного числа, не связанного ни с первым, ни со вторым. И так далее. Таким образом, алгоритм генерирует ряд новых чисел, которые будут нам казаться действительно случайными.
Простой алгоритм случайных чисел
Написать простейший генератор случайных чисел несложно. Вот как выглядит программа на C++, которая позволяет генерировать 100 рандомных чисел:
А вот результат:
Каждое число в этом ряду кажется нам случайным по отношению к предыдущему. Однако, говоря по правде, данный алгоритм достаточно примитивен.
Но зачем изобретать велосипед, когда для генерации у нас есть специальные функции?
Функции srand() и rand()
В языки программирования C и C++ встроены собственные генераторы случайных чисел. Реализованы они с помощью двух отдельных функций, которые находятся в заголовочном файле cstdlib: 1) srand(). Устанавливает значение, передаваемое пользователем, в качестве стартового. Вызывается лишь 1 раз: в начале программы (как правило, в верхней части функции main());
2) rand(). Обеспечивает генерацию следующего случайного числа в имеющейся последовательности. Число будет находиться в промежутке от нуля до RAND_MAX (это константа в cstdlib, значение которой составляет 32 767).