Мы всегда на связи

Пишите в любое удобное время:
whatsappvktelegram
Или задайте вопрос через форму:

В программировании не существует случайных чисел! О том как работает random

19.04.2026 

Представьте, что вы запускаете программу, которая должна выдать случайное число и получаете результат. Но вот вы запускаете её снова… и видите точно такое же число! Совпадение? Баг? Вовсе нет — на самом деле, это абсолютно нормальное поведение, ведь в программировании не существует по-настоящему случайных чисел.

Давайте разбираться вместе!

Простейший генератор: функция rand()

Начнём с базового примера: В языке C++ есть стандартная функция rand(), которая генерирует псевдослучайные числа:

1

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

Например, такой:

2

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

Как сделать числа действительно разными?

Чтобы получать разные числа при каждом запуске программы, нужно каким-то образом поменять начальное значение. Само же начальное значение можно ввести в srand() — функция, которая и инициализирует генератор случайных чисел.

3

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

4

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

Поэтому добавим эту небольшую деталь:

5

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

Современный подход

В современной C++ есть заголовок <random> с продвинутыми генераторами. Вот пример использования:

6

Разберём три важных свойства генераторов, которые необходимо учитывать при их разработке.

1. Длина периода

Длина периода —  это размер «цикличности» генератора, то есть показатель того, через сколько чисел результат будет повторяться. Чем длиннее период, тем безопаснее генератор.

Например, у старой функции rand() период составляет всего около двух миллиардов чисел. А у генератора mt19937 период равен числу с более чем 6000 нулями!

2. Производительность

Производительность показывает, сколько времени и памяти требуется для генерации чисел. Вот, например, два варианта:

7

3. Качество (стохастичность)

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

8

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

  1. Не создавать генератор заново
9

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

10

Если в следующий раз вы увидите «случайное» число в программе, то стоит задуматься, что за этой простой функцией стоит сочетание сложной математики, продуманных алгоритмов, скорости, качества и безопасности.

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

Начать программировать легко!

С 4 июня
Курс Python Start для детей от 4 класса.

Часто задаваемые вопросы

Потому что rand() — это псевдослучайный генератор. Он работает по математической формуле, и начальное значение (seed) при запуске программы всегда одинаковое. Чтобы числа менялись, нужно задать разный seed, например, через srand(time(0)).

Seed (зерно) — это начальное значение, с которого генератор начинает вычислять последовательность чисел. Если seed одинаковый — последовательность тоже будет одинаковой. Если seed разный — последовательность будет разной. Поэтому для «случайности» важно использовать меняющийся seed, например, текущее время.

Для большинства обычных задач — да. Но с точки зрения безопасности — нет. Алгоритм rand() слишком простой и предсказуемый. Злоумышленник может восстановить вашу последовательность и узнать, например, какие числа выпали. Для серьёзных вещей (криптография, защита данных) rand() не подходит.

Это количество чисел, которые генератор выдаст до того, как последовательность начнёт повторяться. У старой rand() период около 2 миллиардов. У современного mt19937 период — число с более чем 6000 нулями. Для обычных задач хватит и того, и другого, но для науки и безопасности период имеет значение.

Занятие с репетитором
по математике
и программированию
Записаться

Понравилась статья?

Подпишись на Телеграм школы, чтобы не пропустить новые статьи и новости
Telegram канал