В программировании не существует случайных чисел! О том как работает random
19.04.2026
Представьте, что вы запускаете программу, которая должна выдать случайное число и получаете результат. Но вот вы запускаете её снова… и видите точно такое же число! Совпадение? Баг? Вовсе нет — на самом деле, это абсолютно нормальное поведение, ведь в программировании не существует по-настоящему случайных чисел.
Давайте разбираться вместе!
Простейший генератор: функция rand()
Начнём с базового примера: В языке C++ есть стандартная функция rand(), которая генерирует псевдослучайные числа:

Если запустить эту программу несколько раз, то будет один тот же результат.
Например, такой:

Это происходит, потому что rand() — это псевдослучайный генератор. Он работает по математической формуле, где каждое следующее число зависит от предыдущего. Во время старта программы начальное значение (seed) всегда одно и тоже.
Как сделать числа действительно разными?
Чтобы получать разные числа при каждом запуске программы, нужно каким-то образом поменять начальное значение. Само же начальное значение можно ввести в srand() — функция, которая и инициализирует генератор случайных чисел.

В выводе теперь получились новые числа, но, если запустить эту программу ещё несколько раз, опять ничего не поменяется:

То есть, чтобы каждый раз действительно получались разные числа, нам при каждом запуске программы нужно вводить в srand() совершенно новое число. Для этого есть один лайфхак! Какое значение меняется каждую секунду? Время! Момент запуска программы происходит в определённый момент времени, и этот момент всегда уникальный (мы ведь не можем вернуться в прошлое).
Поэтому добавим эту небольшую деталь:

Вот теперь программа действительно будет выдавать всегда разные числа. Но такой подход имеет серьёзные недостатки. Во-первых, хоть rand() и генерирует случайное число (псевдослучайное), но его алгоритм крайне простой и предсказуемый. Поэтому злоумышленнику не составит труда разгадать ваше полученное число.
Современный подход
В современной C++ есть заголовок <random> с продвинутыми генераторами. Вот пример использования:

Разберём три важных свойства генераторов, которые необходимо учитывать при их разработке.
1. Длина периода
Длина периода — это размер «цикличности» генератора, то есть показатель того, через сколько чисел результат будет повторяться. Чем длиннее период, тем безопаснее генератор.
Например, у старой функции rand() период составляет всего около двух миллиардов чисел. А у генератора mt19937 период равен числу с более чем 6000 нулями!
2. Производительность
Производительность показывает, сколько времени и памяти требуется для генерации чисел. Вот, например, два варианта:

3. Качество (стохастичность)
Качество или стохастичность — это параметр, определяющий насколько последовательность похожа на настоящую случайную. Пример плохого генератора:

Правильное использование генератора
- Не создавать генератор заново

2. Правильно использовать распределение для нужного диапазона

Если в следующий раз вы увидите «случайное» число в программе, то стоит задуматься, что за этой простой функцией стоит сочетание сложной математики, продуманных алгоритмов, скорости, качества и безопасности.
Истинной случайности в компьютерах нет, есть лишь хорошо спроектированные псевдослучайные последовательности, который ведут себя как случайные. Понимание эти принципов поможет писать более надёжные программы, где качество критично: от научных расчётов до компьютерных игр и криптографии.
Вебинары
Часто задаваемые вопросы
Почему при каждом запуске программы rand() выдаёт одни и те же числа?
Потому что rand() — это псевдослучайный генератор. Он работает по математической формуле, и начальное значение (seed) при запуске программы всегда одинаковое. Чтобы числа менялись, нужно задать разный seed, например, через srand(time(0)).
Что такое seed и зачем он нужен?
Достаточно ли srand(time(0)) для настоящей случайности?
Для большинства обычных задач — да. Но с точки зрения безопасности — нет. Алгоритм rand() слишком простой и предсказуемый. Злоумышленник может восстановить вашу последовательность и узнать, например, какие числа выпали. Для серьёзных вещей (криптография, защита данных) rand() не подходит.
Что такое длина периода генератора?
Это количество чисел, которые генератор выдаст до того, как последовательность начнёт повторяться. У старой rand() период около 2 миллиардов. У современного mt19937 период — число с более чем 6000 нулями. Для обычных задач хватит и того, и другого, но для науки и безопасности период имеет значение.

по математике
и программированию