В чём разница между псевдослучайными и истинно случайными числами и как их различить

· · Псевдослучайные числа, Истинно случайные числа, RNG, CSPRNG, Безопасность

Разговоры о случайных числах быстро сбиваются с толку, потому что совершенно разные вещи называют одним словом «случайное». Последовательность, вычисленная чем-то вроде Math.random(), и последовательность, полученная из физических явлений вроде теплового шума или джиттера тактового генератора, выглядят достаточно «рассеянными», если судить только по внешнему виду.

Однако на практике, если оставить это различие размытым, легко ошибиться в таких решениях.

  • Хочется воспроизводимости в симуляции, но результаты каждый раз плывут
  • Токен для повторной выдачи пароля создаётся из легко предсказуемых случайных чисел
  • Прохождение статистического теста воспринимается как доказательство «это настоящие случайные числа»
  • И наоборот - услышав слово «псевдо», всё сразу считают опасным

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

Содержание статьи основано на материалах NIST, IETF, а также официальной документации ОС и языков программирования, доступных по состоянию на апрель 2026 года.

Содержание

  1. Сначала вывод (одной фразой)
  2. Что в этой статье называется «псевдослучайным» и «истинно случайным»
  3. Сначала - обзор на одной странице
    • 3.1. Схема взаимосвязей
    • 3.2. Кратчайший словарь терминов
  4. Что такое псевдослучайные числа
    • 4.1. Одной фразой
    • 4.2. Обычный PRNG и CSPRNG нужно рассматривать отдельно
  5. Что такое истинно случайные числа
    • 5.1. Одной фразой
    • 5.2. Физические случайные числа тоже не всегда используются как есть
  6. В чём именно разница
    • 6.1. Источник генерации
    • 6.2. Воспроизводимость
    • 6.3. Предсказуемость
    • 6.4. Скорость и эксплуатация
  7. Как их различить
    • 7.1. По одному лишь выводу различить в принципе невозможно
    • 7.2. Сначала нужно смотреть на конструкцию генератора
    • 7.3. Затем - искать явные дефекты статистическими тестами
    • 7.4. Для задач безопасности смотреть глазами атакующего
  8. Что использовать для какой задачи
  9. Частые заблуждения
  10. Таблица решений на случай сомнений
  11. Итог
  12. Справочные материалы

1. Сначала вывод (одной фразой)

Если сформулировать довольно грубо, но полезно для практики, получится так.

  • Псевдослучайные числа - это последовательность, детерминированно создаваемая из внутреннего состояния и алгоритма
  • Истинно случайные числа - это последовательность, источником энтропии которой служит физическое явление вроде теплового шума или джиттера
  • Однако многие безопасные API случайных чисел, используемые на практике, возвращают не сырые физические случайные числа, а DRBG / CSPRNG, засеянный источником энтропии
  • Поэтому различить их только по признаку «выглядит ли случайным» нельзя. Нужно смотреть на конструкцию генератора, способ подачи seed, reseed и health test
  • В симуляциях и воспроизводимых тестах воспроизводимость псевдослучайных чисел становится преимуществом
  • Для задач безопасности - ключей, токенов, nonce - базовое правило: использовать безопасный API случайных чисел, предоставляемый ОС или языком

Иными словами, если сразу разделить эти три категории, промахнуться сложно.

  1. Речь идёт об обычном PRNG?
  2. Речь идёт о криптографическом PRNG / CSPRNG / DRBG?
  3. Речь идёт об NRBG / TRNG с физическим источником энтропии?

2. Что в этой статье называется «псевдослучайным» и «истинно случайным»

В этом разговоре просто сказать «случайные числа» - слишком широко. Поэтому сначала зафиксируем значения.

  • Псевдослучайные числа (PRNG): последовательность, генерируемая детерминированной процедурой из seed и внутреннего состояния. При одинаковых условиях получается одна и та же последовательность
  • Криптографически стойкие псевдослучайные числа (CSPRNG / DRBG): разновидность псевдослучайных чисел, но с акцентом на трудность предсказания. NIST SP 800-90A определяет этот deterministic random bit generator
  • Истинно случайные числа: в обиходе часто означает «настоящие» или «физические» случайные числа. В терминологии NIST ближайшее понятие - NRBG (non-deterministic random bit generator), которое описывается как генератор, постоянно обращающийся к источнику энтропии и при нормальной работе выдающий вывод с полной энтропией

Здесь важно, что «псевдослучайное» и «опасное случайное» - не синонимы.

Например, быстрые PRNG вроде линейного конгруэнтного метода или простого xorshift и CSPRNG вроде CTR_DRBG или HMAC_DRBG - оба детерминированы, но их значение для безопасности сильно различается.

3. Сначала - обзор на одной странице

3.1. Схема взаимосвязей

Быстрее всего увидеть взаимное расположение понятий на одной схеме.

Физическое явлениетепловой шум, джиттер и т. п.Источник энтропииseed / reseedDRBG / CSPRNGбыстрое разворачивание случайных чиселСлучайные числа, возвращаемые ОС / библиотекойВнутреннее состояние + формулаОбычный PRNGПоследовательность, выглядящая случайной

Здесь важно, что вывод «безопасного API случайных чисел», который получает приложение, немного отличается и от обычного PRNG справа, и от сырого физического шума слева.

Большинство реализаций используют источник энтропии слева для seed / reseed, а затем возвращают значения, быстро развёрнутые через DRBG / CSPRNG. NIST SP 800-90B и 800-90C - это как раз документы, систематизирующие такую конструкцию источник энтропии + детерминированный генератор.

3.2. Кратчайший словарь терминов

Вид Из чего создаётся Воспроизводимость при тех же условиях Что требуется в первую очередь Подходит для
Обычный PRNG Формула и внутреннее состояние Да Скорость, воспроизводимость Симуляции, игры, тестирование
CSPRNG / DRBG Криптографический алгоритм + seed Да Трудность предсказания Ключи, токены, nonce, session ID
Истинно случайные числа / NRBG Физический источник энтропии Практически нет Физическая неопределённость, энтропия Подача seed, сертифицированные устройства, лотереи с серьёзным аудитом

Если нужна самая короткая формулировка, вот она.

  • Обычный PRNG - это «случайность, которую можно воспроизвести»
  • CSPRNG - это «случайность, которую можно воспроизвести, но которая спроектирована так, чтобы её было трудно предсказать извне»
  • Истинно случайные числа - это «случайность, извлекающая энтропию из физических явлений»

4. Что такое псевдослучайные числа

4.1. Одной фразой

Псевдослучайные числа - это последовательность, которая «выглядит случайной», вычисляемая с обновлением внутреннего состояния.

Если задать один и тот же seed, использовать тот же алгоритм и извлечь то же количество значений, получится одна и та же последовательность. Это выглядит как недостаток, но для симуляций, тестирования и отладки это скорее большое преимущество.

Именно благодаря воспроизводимости возможны такие сценарии, как «на этом seed возникает баг» или «хочу снова сравнить со вчерашним результатом».

4.2. Обычный PRNG и CSPRNG нужно рассматривать отдельно

Это самое частое заблуждение. Утверждение «псевдослучайное = поддельное = использовать нельзя» неверно.

NIST SP 800-90A определяет детерминированные генераторы случайных битов на основе хеш-функций и блочных шифров. То есть значительная часть ядра случайных чисел, используемых в криптографии, - это сами по себе детерминированные генераторы.

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

  • Обычный PRNG
    • Быстрый
    • Легко воспроизводится
    • Легко предсказывается, если утекли внутреннее состояние или seed
  • CSPRNG / DRBG
    • Тоже детерминирован
    • Но спроектирован так, чтобы при защищённом внутреннем состоянии вывод было трудно предсказать
    • Для задач безопасности используется именно он

Поэтому оценка безопасности только по признаку «псевдослучайное это или нет» почти всегда приводит к ошибке. Смотреть нужно на то, «какой именно псевдослучайный генератор».

5. Что такое истинно случайные числа

5.1. Одной фразой

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

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

5.2. Физические случайные числа тоже не всегда используются как есть

Это тоже важно. То, что это «истинно случайные числа», не означает, что сырые измерения передаются приложению напрямую.

У физических источников есть несколько практических сложностей.

  • Присутствует смещение
  • Подвержены влиянию температуры, питания, отказов, старения
  • Сырая скорость вывода иногда не очень высока
  • Без проверки работоспособности сломанный источник легко не заметить

Из-за этого NIST SP 800-90B делает акцент на принципах проектирования источника энтропии, понятии min-entropy, validation test и health testing. А в реализации в целом чаще применяется конструкция источник энтропии + DRBG, описанная в NIST SP 800-90C.

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

6. В чём именно разница

Различие между видами случайных чисел нельзя полностью описать вопросом «выглядит ли это случайным». Как минимум удобно смотреть по этим четырём осям.

6.1. Источник генерации

  • Псевдослучайные числа: алгоритм и внутреннее состояние
  • Истинно случайные числа: физический источник энтропии

Это самое фундаментальное различие.

6.2. Воспроизводимость

  • Псевдослучайные числа: воспроизводимы при том же seed
  • Истинно случайные числа: при повторном получении в тех же условиях та же последовательность значений почти не повторяется

Воспроизводимость - сила в тестировании и может быть слабостью в лотереях.

6.3. Предсказуемость

  • Обычный PRNG: если можно прочитать seed или внутреннее состояние, будущее в значительной степени известно
  • CSPRNG: при защищённом внутреннем состоянии спроектирован так, чтобы предсказание было затруднено
  • Истинно случайные числа: трудно предсказать, если физический источник исправен, но дефекты сенсора или ошибки проектирования - отдельная проблема

Для безопасности эта ось важнее всего. Значение имеет не то, насколько «рассеян» вывод внешне, а то, можно ли угадать следующее значение.

6.4. Скорость и эксплуатация

  • Псевдослучайные числа: быстро, стабильно, легко реализовать
  • Истинно случайные числа: требуют сбора энтропии и мониторинга, есть ограничения по скорости и стоимости реализации

Поэтому в продакшн-системах реалистичный выбор - не «только истинно случайные» и не «только псевдослучайные», а CSPRNG, засеянный физической энтропией.

7. Как их различить

7.1. По одному лишь выводу различить в принципе невозможно

Это самый важный ответ. Глядя только на конечную выходную последовательность, нельзя утверждать «это истинно случайные числа».

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

Поэтому утверждение «выглядит естественно - значит, настоящее» не работает. В NIST SP 800-22 тоже указано, что статистическое тестирование - лишь первый шаг и само по себе никак не доказывает валидность генератора абсолютно.

С другой стороны, хороший CSPRNG проектируется так, чтобы его было очень трудно отличить от истинной случайности по одному только выводу. Здесь «неразличимость» - это, скорее, сама цель проектирования.

7.2. Сначала нужно смотреть на конструкцию генератора

При различении важнее не внешний вид вывода, а проверка следующего.

  • Какой алгоритм генерации
    • Простой PRNG или DRBG / CSPRNG?
  • Откуда берётся seed
    • Фиксированный seed, время или PID?
    • Или источник энтропии ОС?
  • Происходит ли reseed
    • Seed задаётся один раз при запуске и больше не меняется?
    • Или подаётся повторно во время работы?
  • Есть ли проверка источника энтропии
    • Оценка min-entropy
    • Health test
    • Обнаружение отказов
  • Какой API используется
    • Собственная реализация?
    • Стандартный API ОС / языка?

С этой точки зрения различить удаётся в значительной части случаев.

  • «При фиксированном seed каждый раз получается одна и та же последовательность» → псевдослучайные числа
  • «Есть физический источник энтропии, предполагаются validation / health test» → конструкция с источником истинной случайности
  • «Вызывается безопасный RNG API ОС» → чаще всего гибрид физическая энтропия + CSPRNG

7.3. Затем - искать явные дефекты статистическими тестами

Статистическое тестирование не бесполезно - напротив, оно важно. Но его роль ближе к «обнаружению дефектов», чем к «доказательству».

Обычно рассматривают такие аспекты.

  • Смещение между 0 и 1
  • Смещение серий (run)
  • Периодичность
  • Корреляция
  • Приближённая энтропия
  • Линейная сложность

Часто ссылаются на NIST SP 800-22, а в Японии - на минимальный набор тестов случайности CRYPTREC. Они эффективны для проверки того, «нет ли в этой последовательности странного смещения или структуры».

Однако прохождение этих тестов не означает «истинно случайные числа». Хорошо сделанный CSPRNG обычно проходит их без проблем, а физический источник случайных чисел, наоборот, может провалить тест из-за смещения сенсора или неисправности.

Позиция тестирования примерно такая.

  • Прошёл: пока явных дефектов не видно
  • Провалился: что-то, скорее всего, не в порядке
  • «Значит, доказано, что это настоящее»: этого сказать нельзя

7.4. Для задач безопасности смотреть глазами атакующего

Для токенов повторной выдачи пароля, session ID, nonce, генерации ключей вопроса «настоящее ли это» недостаточно.

По-настоящему важно проверить, может ли атакующий предсказать следующее значение.

Например:

  • seed задаётся только текущим временем;
  • просто подмешивается PID или порядковый номер;
  • собственная реализация без оценки качества seed;
  • API семейства random используется для задач безопасности.

Ничего из этого не предотвращается тем, что «внешне выглядит правдоподобно».

Японская IPA тоже рекомендует знать API, связанные с безопасностью, и существующие библиотеки, избегая необдуманных собственных реализаций. В Python явно указано отдавать предпочтение модулю secrets, а не random. В Java эту роль играет SecureRandom.

В итоге для безопасности важнее не «псевдослучайное это или настоящее», а «используется ли безопасный seed / энтропия и безопасный API».

8. Что использовать для какой задачи

Задача Подходящий вариант Причина
Симуляция, метод Монте-Карло, игровая логика Обычный PRNG Быстро, воспроизводимо через seed
Воспроизведение тестов, воспроизведение багов Обычный PRNG Можно повторить те же входные данные
Ключи, токены, nonce, session ID CSPRNG / безопасный RNG API ОС Требуется трудность предсказания
Подача seed, лотереи с серьёзным аудитом и подотчётностью Конструкция с физическим источником случайности или проверяемый механизм Важны физическая энтропия и следы аудита
«Безопасная случайность» в обычной разработке приложений Стандартный безопасный RNG ОС / языка Сложнее ошибиться, чем при собственной реализации

На уровне реализации безопасный выбор такой.

  • Нативный Windows: BCryptGenRandom
  • .NET: System.Security.Cryptography.RandomNumberGenerator
  • Linux: getrandom()
  • Python: secrets
  • Java: SecureRandom

Для Windows Microsoft Learn описывает, что провайдер по умолчанию за BCryptGenRandom соответствует CTR_DRBG из NIST SP800-90. getrandom() в Linux также документирован как источник случайных байтов, пригодных для cryptographic purposes. RandomNumberGenerator в .NET, secrets в Python и SecureRandom в Java - это API, спроектированные с расчётом на криптографическое применение.

9. Частые заблуждения

9.1. Если генератор прошёл статистические тесты, значит, это истинно случайные числа

Неверно. Это говорит лишь о том, что «явного смещения не видно».

9.2. Если это истинно случайные числа, они всегда безопасны

Неверно. Отказ физического источника, смещение, ошибки реализации, отсутствие health test - всё это разрушает качество.

9.3. Псевдослучайные числа всегда опасны

Неверно. CSPRNG / DRBG - напротив, ядро практических безопасных API случайных чисел.

9.4. Для задач безопасности нужно использовать только сырые физические случайные числа напрямую

Не обязательно. На практике обычным решением является сочетание физического источника энтропии и CSPRNG.

9.5. random или Math.random() тоже достаточно «рассеяны», значит, их можно использовать для токенов

Не та задача. Внешняя рассеянность и трудность предсказания для атакующего - разные вещи.

10. Таблица решений на случай сомнений

Порядок рассуждений в случае сомнений такой.

  1. Нужно ли воспроизводить один и тот же результат?
    • Да → обычный PRNG
    • Нет → далее
  2. Будет ли проблемой, если атакующий сможет предсказать значение?
    • Да → стандартный безопасный RNG ОС / языка
    • Нет → выбирать по требованиям к качеству и скорости
  3. Нужна ли подотчётность или аудит самого источника случайности?
    • Да → рассмотреть физический источник случайности или сертифицированный сервис
  4. Хочется реализовать самостоятельно?
    • Понятное желание, но случайные числа легко реализовать неверно - сначала стоит использовать стандартный API

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

11. Итог

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

  • Псевдослучайные числа создаются вычислением
  • Истинно случайные числа берут энтропию из физических явлений
  • Но в реальной практике главную роль в безопасных API случайных чисел играет промежуточный вариант - источник энтропии + CSPRNG

Иными словами, смотреть нужно не на внешний вид, а на конструкцию.

  • По одному лишь выводу нельзя утверждать, что это настоящие случайные числа
  • Статистические тесты помогают обнаруживать дефекты, но не служат доказательством
  • В безопасности главное - «можно ли это предсказать»
  • Если нужна воспроизводимость - используйте PRNG, если нужна трудность предсказания - стандартный безопасный RNG ОС / языка

При таком взгляде можно выйти из грубого противопоставления «псевдослучайные числа - это подделка?».

12. Справочные материалы

  1. NIST SP 800-90A Rev. 1: Recommendation for Random Number Generation Using Deterministic Random Bit Generators Базовый документ о детерминированных генераторах случайных битов.

  2. NIST SP 800-90B: Recommendation for the Entropy Sources Used for Random Bit Generation Систематизирует подход к источникам энтропии, валидации и health testing.

  3. NIST SP 800-90C: Recommendation for Random Bit Generator (RBG) Constructions Систематизирует конструкцию источник энтропии + DRBG.

  4. NIST SP 800-22 Rev. 1a: A Statistical Test Suite for Random and Pseudorandom Number Generators for Cryptographic Applications Объясняет позицию статистического тестирования. Важно, что тестирование - первый шаг, а не доказательство.

  5. NIST Glossary: Non-deterministic Random Bit Generator (NRBG) Полезно для проверки термина NIST, ближайшего к «истинно случайному».

  6. RFC 4086: Randomness Requirements for Security Систематизирует нюансы случайных чисел и источников энтропии для задач безопасности.

  7. Microsoft Learn: BCryptGenRandom function Описывает безопасный RNG API Windows и CTR_DRBG провайдера по умолчанию.

  8. Linux man page: getrandom(2) API случайных чисел Linux, пригодный для cryptographic purposes.

  9. Microsoft Learn: RandomNumberGenerator Class Криптографически стойкий RNG API .NET.

  10. Python documentation: secrets — Generate secure random numbers for managing secrets Основы работы со случайными числами для задач безопасности в Python.

  11. Oracle Java Documentation: SecureRandom Обзор безопасного RNG в Java и подхода к seed / энтропии.

  12. IPA: Chapter 3, Section 3 — Using Strong Cryptography and Pseudo-Random Numbers Важность seed, тестирования и нюансы использования API (на японском языке).

Недавние статьи с теми же тегами помогут подробнее изучить близкие темы.

Если ваше Windows-приложение приняли за вирус — как реагировать на ложные срабатывания Microsoft Defender и жить с влиянием на производительность

Разбираем правильный порядок действий, если Microsoft Defender ложно определяет ваше Windows-приложение как вредоносное: как устроена сов...

Что сделать перед утилизацией Windows PC — практический чек-лист по стиранию данных, отвязке учётных записей и резервному копированию

Разбираем, что нужно сделать перед утилизацией, передачей, продажей или возвратом по лизингу Windows PC: резервное копирование, стирание ...

Эти страницы показывают тему статьи в более широком контексте услуг и решений.

Статья напрямую связана со следующими услугами.

Технические консультации и ревью дизайна

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

Частые вопросы

Вопросы, которые часто возникают при консультациях по теме статьи.

В чём разница между псевдослучайными числами и истинно случайными (настоящими) числами?
Псевдослучайные числа (PRNG) - это последовательность, детерминированно создаваемая алгоритмом из seed и внутреннего состояния: при одинаковых условиях получается одна и та же последовательность. Истинно случайные числа - это последовательность, источником энтропии которой служит физическое явление вроде теплового шума или джиттера генератора, и при повторном получении в тех же условиях та же последовательность значений почти не повторяется. Однако многие безопасные API случайных чисел, используемые на практике, возвращают не сырые физические случайные числа, а гибридную конструкцию - CSPRNG / DRBG, засеянный физическим источником энтропии.
Можно ли по одному только выводу отличить псевдослучайные числа от истинно случайных?
Определить по конечной выходной последовательности, что это именно истинно случайные числа, невозможно. Причина проста: детерминированную программу, возвращающую в точности ту же последовательность, что и наблюдаемая, можно построить всегда. При различении важнее не внешний вид вывода, а конструкция генератора: какой используется алгоритм генерации, откуда берётся seed, происходит ли reseed, есть ли проверка источника энтропии (оценка min-entropy, health test) и какой именно API используется.
Если генератор проходит статистические тесты, можно ли считать его истинно случайным?
Нет, нельзя. Роль статистических тестов ближе к обнаружению дефектов, чем к доказательству. В NIST SP 800-22 тоже указано, что статистическое тестирование - лишь первый шаг и само по себе никак не доказывает валидность генератора абсолютно. Хорошо сделанный CSPRNG обычно проходит такие тесты без проблем, а физический источник случайных чисел, наоборот, может провалить их из-за смещения сенсора или неисправности. Позиция такая: прохождение теста означает, что явных дефектов пока не видно, а провал - что что-то, скорее всего, не в порядке.
Какой API случайных чисел использовать для задач безопасности?
Для ключей, токенов, nonce и session ID базовое правило - использовать безопасный API случайных чисел, предоставляемый ОС или языком. Конкретно: для нативного Windows - BCryptGenRandom, для .NET - System.Security.Cryptography.RandomNumberGenerator, для Linux - getrandom(), для Python - модуль secrets, для Java - SecureRandom. Следует избегать собственных реализаций с seed на основе текущего времени или PID, а также использования API семейства random для задач безопасности.

Об авторе

Страница с профилем автора статьи.

Го Комура

Представитель KomuraSoft LLC

Специализируется на разработке программного обеспечения для Windows, техническом консалтинге и расследовании сбоев, особенно в проектах с унаследованными системами и трудно воспроизводимыми ошибками.

Публичные ссылки

Вернуться в блог