Генератор случайных чисел
Random number generator
Также: ГСЧ, RNG
Генератор случайных чисел — устройство или программа, которые выдают числа для случайного выбора, используя физический источник неопределённости или вычисляя последовательность из начального состояния. Правила выбора задают возможные результаты и их вероятности: не у всех результатов обязательно равные шансы.
Основание определения: RFC 4086 различает источники энтропии и псевдослучайные последовательности, а NIST SP 800-90A описывает детерминированные механизмы генерации битов. [2, 3]
Представьте учебную группу: преподавателю нужно выбрать один из двадцати вопросов. Можно пронумеровать их и получить число от одного до двадцати. Но сначала надо решить, допустим ли повтор вопроса и должны ли все вопросы выпадать с одинаковой вероятностью. Кнопка сама этих условий не устанавливает. Это учебная ситуация редакции: она показывает, зачем вместе с результатом сохранять правила выбора.
Кратко
- Равномерность означает одинаковые вероятности допустимых значений, а непредсказуемость — невозможность практически угадать результат при заданных знаниях наблюдателя. Для безопасности RFC 4086 различает эти требования. [2]
- Псевдослучайный механизм не обязательно слабый: NIST описывает специальные детерминированные генераторы для криптографических задач. [3]
- Повторение числа допустимо в режиме с повторениями. Режим без повторений решает другую задачу.
- Приложенный инструмент выбирает числа и сохраняет локальную запись. Он не проверяет участников и не создаёт независимого свидетельства честности.
Открыть мини-инструмент к статье → Расчёт идёт в браузере, данные никуда не отправляются.
Происхождение и история термина
До браузерных приложений случайные значения распространяли в виде таблиц.
В июне 2005 года опубликован RFC 4086 о случайности для задач безопасности. Его разделы рассматривают физические источники и алгоритмические последовательности отдельно от требований к защите от предсказания. [2] В июне 2015 года NIST выпустил SP 800-90A Revision 1 о детерминированной генерации случайных битов. На странице этой публикации также указан проект Revision 2. [3] Эти документы помогают различать понятия; старые примеры алгоритмов из RFC не следует принимать за готовую современную систему безопасности.
Суть и механизм
От источника до числа на экране
Полезно различать три действия: получить исходные данные, вычислить последовательность и перевести значения в нужный диапазон. Энтропией в этом контексте называют меру неопределённости исходных данных. RFC 4086 обсуждает источники такой неопределённости и предупреждает: статистически убедительный ряд может оставаться предсказуемым для того, кто знает его устройство или исходные данные. [2]
Начальное состояние, часто называемое seed, запускает детерминированную последовательность: дальнейшие значения задаются алгоритмом. Это удобно, например, когда надо повторить учебный вычислительный опыт с теми же исходными условиями. Но повторяемость и защита от угадывания — разные цели. Конструкции NIST SP 800-90A используют хеш-функции или блочные шифры; одна надпись «псевдослучайный» ничего не говорит о пригодности конкретной реализации. [3]
Учебная аналогия редакции: если в конверт положить заранее напечатанный ряд цифр, читатель может увидеть внешне беспорядочный результат. Тот, у кого есть копия листа и известна текущая позиция, знает следующую цифру. Здесь проблема не в том, сколько разных цифр встречается на листе, а в знаниях наблюдателя. Для выбора вопроса и для создания криптографического секрета нужны разные доказательства пригодности. [2]
Как возникает перекос диапазона
Представьте мешок с восемью одинаковыми на ощупь карточками, пронумерованными от 0 до 7. Нужно выбрать одну из трёх команд. Если брать остаток от деления номера на три, к первой команде (остаток 0) относятся карточки 0, 3 и 6; ко второй (остаток 1) — 1, 4 и 7; к третьей (остаток 2) — только 2 и 5. При равновероятном вытягивании шансы команд равны 3/8, 3/8 и 2/8.
Уберём перекос: если попалась 6 или 7, верните карточку, перемешайте мешок и вытяните снова. В этой учебной модели каждое вытягивание независимо от предыдущих, и у каждой карточки снова шанс 1/8. Например, вытянули 7, вернули, затем вытянули 4: номер 7 мы отбросили, а номер 4 даёт остаток 1 — выбрана вторая команда. Из шести принимаемых карточек каждой команде достаются две. Сколько бы попыток ни потребовалось, среди принятых карточек у каждой команды шанс 2/6 = 1/3. Вероятность двух отказов подряд — (2/8)², трёх — (2/8)³; с ростом числа попыток вероятность так и не получить ответ стремится к нулю.
Почему важно перемешивать заново? Пусть вместо мешка номера идут по кругу: 0, 1, …, 7, затем снова 0. Даже если начать со случайной позиции, после 6 или 7 первым принятым номером обязательно станет 0. Первая команда тогда выигрывает при старте с 0, 3, 6 или 7 — в четырёх случаях из восьми. Равных шансов у каждого отдельного запроса недостаточно: результат повторной попытки не должен зависеть от того, что было отброшено.
Общее правило. Пусть каждый запрос независимо даёт одно из M равновероятных целых чисел от 0 до M − 1, а выбрать нужно один из N вариантов, где 1 ≤ N ≤ M. Найдите наибольшее кратное N, не превышающее M: L = floor(M/N) × N, где floor — округление вниз. Если номер меньше L, возьмите его остаток от деления на N; иначе запросите новое число. В первых L номерах каждый остаток встречается ровно L/N раз. Поэтому на любой принятой попытке у каждого варианта вероятность (L/N)/L = 1/N. Для случайных машинных слов такое преобразование с отбрасыванием верхней части диапазона разобрано у Даниэля Лемира. [8]
Если нужны десять вариантов, а карточек восемь, то L = 0: ни одна карточка не пройдёт проверку. Для десяти вариантов возьмите два независимых номера a и b от 0 до 7 и вычислите 8 × a + b. Получатся 64 равновероятных числа от 0 до 63. Принимайте 0…59 и берите остаток от деления на десять: каждому результату соответствуют шесть чисел. Если получилось 60…63, начните заново с новой независимой пары. Это способ расширить исходный диапазон; одна карточка больше восьми исходов не даёт.
Виды и классификации
По механизму различают использование физических источников и алгоритмическую генерацию. RFC 4086 рассматривает источники энтропии и псевдослучайные последовательности; NIST подробно описывает специальный детерминированный класс DRBG, то есть генераторов случайных битов. [2, 3] Физическое происхождение данных само по себе не доказывает качество всей программы, а алгоритмическое не означает неизбежно плохого результата.
Для пользователя важнее дополнительные условия задачи. Следующая таблица — редакционная классификация режимов, не стандарт сертификации.
| Условие | Варианты | Что меняется |
|---|---|---|
| Вероятности | Одинаковые или разные | Имеют ли все номера равные шансы? |
| Повторения | С возвратом или без возврата | Остаётся ли выбранный номер среди следующих допустимых? |
| Набор | Сплошной целый диапазон или список | Всем ли номерам соответствует нужный объект? |
| Сохранение | Локальная запись или внешне проверяемая процедура | Может ли наблюдатель восстановить исходные условия? |
В учебном выборе трёх вопросов из двадцати режим с возвратом допускает один и тот же вопрос несколько раз. Без возврата уже выбранный вопрос исключается. Во втором случае отдельные шаги связаны: после первого выбора остаётся девятнадцать вариантов, после второго — восемнадцать. Это не исправление ошибки случайности, а другое правило задачи.
Как применяется на практике
В браузере
В рабочем проекте W3C Web Cryptography Level 2 от 22 апреля 2025 года getRandomValues описан как метод получения криптографически стойких случайных значений. Проект предусматривает использование качественного источника энтропии для инициализации криптографического псевдослучайного механизма. Максимальный размер массива за один вызов — 65 536 байт. Статус Level 2 здесь именно рабочий проект, не завершённая рекомендация. [4]
У Math.random() другое описание: спецификация ECMAScript задаёт приблизительно равномерное значение от нуля включительно до единицы исключительно, а алгоритм зависит от реализации. Это не обещание криптографической стойкости. [6] Поэтому учебный HTML использует crypto.getRandomValues и не подменяет его другим методом при недоступности. Ссылка на API не означает, что редакция проверила внутреннее устройство каждого браузера.
Российский контекст и выбор из списка
В российской документации «КриптоПро Ключ SDK» для класса CryptoProDSS названа инициализация SDK и биологического датчика случайных чисел. Это пример применения термина в конкретной документации, не оценка всех российских генераторов и не рекомендация продукта. [7]
Учебная ситуация редакции: у организатора есть сто двадцать допустимых записей. Каждой сопоставлен один номер от одного до ста двадцати. При равномерном выборе одного номера шанс каждой записи — одна сто двадцатая. Но если одну запись случайно внесли дважды, она получает два номера. Равенство шансов номеров больше не означает равенство шансов людей.
Поэтому в этой учебной процедуре сначала фиксируют список и его порядок, затем выбирают номер. Если запись под номером семнадцать после выбора заменить, сохранённое число уже укажет на другой объект. Это ограничение сопоставления, а не дефект арифметики генератора. Технический выбор числа, состав участников и условия получения приза следует рассматривать отдельно; юридическую квалификацию мероприятия эта статья не определяет.
Как измерить или проверить
Границы, количество и повторения
При включительных целых границах a и b количество вариантов N = b − a + 1. Учебный диапазон от десяти до четырнадцати содержит пять значений: 10, 11, 12, 13, 14. Шесть разных чисел из него получить нельзя. Корректная реакция инструмента — отклонить запрос, а не незаметно сменить режим или добавить дубликат.
При выборе двух разных значений из пяти первое имеет пять вариантов, второе — четыре. Получается двадцать упорядоченных пар: порядок учитывается, поэтому пары 10, 11 и 11, 10 различаются. Если каждый шаг равномерен по оставшимся значениям, вероятность каждой пары равна 1/5 × 1/4 = 1/20. Это проверяемый учебный расчёт, не результат эксперимента над реальным сайтом.
Для наблюдаемого ряда можно вычислить частоту результата: fᵢ = nᵢ / n. Здесь n — число выборов, nᵢ — число появлений нужного значения. Например, если в учебном ряду из двадцати выборов семёрка встретилась трижды, её наблюдаемая частота равна 3/20 = 15%. Из этого не следует, что её заданная вероятность именно пятнадцать процентов. При отсутствии наблюдений делить на ноль нельзя.
Что показывают тесты
NIST SP 800-22 предлагает статистические тесты как один из шагов оценки, но предупреждает: их набор не удостоверяет абсолютную пригодность генератора, а статистическое тестирование не заменяет криптоанализ — изучение возможности взлома механизма. На странице публикации 2010 года отмечено решение о пересмотре от 19 апреля 2022 года. [5] Прохождение этих испытаний приложенным инструментом не заявляется.
Различайте тест программы и тест источника случайности. Если при запросе пяти разных чисел от минус двух до двух программа выдаёт ровно −2, −1, 0, 1, 2 в некотором порядке, проверены диапазон и уникальность. Чтобы оценить вероятности порядков, одного такого запуска недостаточно. Если же границы совпадают, например обе равны семи, единственный допустимый результат известен заранее: это корректный, но не непредсказуемый выбор.
Мини-инструмент статьи
Автономный генератор принимает целые включительные границы от минус миллиарда до миллиарда и количество результатов от одного до тысячи. Он поддерживает оба режима повторений. Один вызов читает 32-битное слово: у него 4 294 967 296 возможных значений, а у самого широкого разрешённого диапазона — 2 000 000 001. Поэтому одного слова на попытку достаточно. Код отбрасывает значения вне наибольшего полного блока и при выборе без повторений исключает уже выбранные позиции. После 10 000 неудачных попыток для одного числа инструмент сообщает об ошибке и не выдаёт частичного результата. При недоступности требуемого API выводится ошибка, без слабой запасной замены.
Введите для учебной проверки минимум −2, максимум 2, количество 5 и режим без повторений. В результате должны быть все пять значений и ни одного дубликата. Затем запросите шесть: программа должна сообщить, что разных значений недостаточно. В режиме с повторениями шесть результатов допустимы. В диапазоне всего пять разных чисел, поэтому хотя бы одно из них обязательно выпадет повторно. Сам по себе этот повтор ничего не говорит о качестве источника случайности.
JSON-выгрузка сохраняет параметры, порядок результатов и время устройства. Время можно изменить, файл — отредактировать, а предыдущие запуски в него не входят. Поэтому выгрузка помогает воспроизвести содержание одной локальной записи, но не заменяет независимый журнал. Сетевые запросы, проверка подписки и хранение списка участников инструментом не выполняются. Он не предназначен для ключей, паролей или финансовых решений.
Ошибки, ограничения и спорные вопросы
Одна ошибка — считать каждый повтор доказательством неисправности. В учебной модели с возвратом выбранное число снова доступно, поэтому повтор допустим. Если же правила обещали отсутствие повторений, дубликат противоречит задаче и требует проверки программы. Важен не внешний вид ряда, а заранее установленное условие.
Другая ошибка — требовать точного равенства частот в любом коротком ряду. Учебная модель равномерного независимого выбора из двух исходов допускает все четыре пары, включая два одинаковых результата. Правило обязательного чередования исключило бы половину этих пар и сделало второй результат известным после первого. Равные вероятности не тождественны красивой симметрии каждого фрагмента.
Третья ошибка — принимать запись экрана одного нажатия за доказательство всей процедуры. В учебном примере оператор мог запускать программу раньше или изменить сопоставление номеров после записи. Видео показывает лишь предъявленные действия. Для проверки надо понимать, какие исходные сведения сохранены и какая часть истории наблюдалась независимо.
Наконец, даже использование криптографического API не превращает весь интерфейс в сертифицированное средство безопасности. Ошибка может появиться в обработке границ, сопоставлении номеров или сохранении результата. W3C отдельно указывает, что для генерации ключей надо использовать generateKey, а не getRandomValues. [4] Учебная страница решает узкую задачу выбора чисел и не обещает проверки остальных действий организатора.
Частые вопросы
Псевдослучайный означает плохой?
Нет. NIST описывает специальные детерминированные конструкции. Оценивать нужно конкретный механизм и требования задачи, а не одно слово в названии. [3]
Почему дважды выпало одно число?
В режиме с повторениями это допустимо. Без повторений такой результат противоречит установленным условиям и требует проверки реализации.
Можно ли выбрать десять разных чисел из пяти?
Нет: в наборе из пяти значений нет десяти различных элементов. Инструмент отклоняет такой запрос, не меняя его смысл.
Доказывает ли локальный JSON честность выбора?
Нет. Это редактируемая запись одного результата, которая не подтверждает неизменность списка и отсутствие предыдущих запусков.
Проверяет ли генератор право на приз?
Нет. Он выбирает числа. Допуск участников, сопоставление с людьми и проверка условий не входят в назначение этой демонстрации.
Решить с помощью сервиса
«Розыгрыши и подарки» готовится к запуску: сервис предназначен для проведения розыгрышей в Telegram, MAX и ВКонтакте с прозрачным выбором победителей. Его назначение шире технической генерации числа; приложенная учебная демонстрация не является этим сервисом и не подтверждает его функции.
Связанные термины
Источники
- Eastlake, D., III, Schiller, J., & Crocker, S. (2005, June). Randomness requirements for security (RFC 4086; BCP 106). https://www.rfc-editor.org/rfc/rfc4086.html (дата обращения: 04.11.2026; аннотация, разделы 2, 3, 6.1.3 и начало 6.2). ↑ а б в г д е
- Barker, E., & Kelsey, J. (2015, June). Recommendation for random number generation using deterministic random bit generators (NIST SP 800-90A Rev. 1). https://csrc.nist.gov/pubs/sp/800/90/a/r1/final (дата обращения: 04.11.2026; использованы аннотация и сведения о версиях, не полный PDF). ↑ а б в г д е
- World Wide Web Consortium. (2025, April 22). Web Cryptography Level 2. First Public Working Draft, раздел 10.1.1. https://www.w3.org/TR/webcrypto/ (дата обращения: 04.11.2026; рабочий проект, не завершённая рекомендация Level 2). ↑ а б
- Rukhin, A., Soto, J., Nechvatal, J., Smid, M., Barker, E., Leigh, S., Levenson, M., Vangel, M., Banks, D., Heckert, A., Dray, J., Vo, S., & Bassham, L. E., III (2010, April). A statistical test suite for random and pseudorandom number generators for cryptographic applications (NIST SP 800-22 Rev. 1a). https://csrc.nist.gov/pubs/sp/800/22/r1/upd1/final (дата обращения: 04.11.2026; использованы авторская аннотация и сведения о пересмотре). ↑
- Ecma International. (n.d.). ECMAScript language specification. Раздел Math.random, открытая разрабатываемая редакция. https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-math.random (дата обращения: 04.11.2026). ↑
- КриптоПро. Классы КриптоПро Ключ SDK // Документация. URL: https://dss.cryptopro.ru/cpkey-cert/cprokey/android/class/intro.html (дата обращения: 04.11.2026). ↑
- Lemire, D. (2018). Fast random integer generation in an interval. arXiv:1805.10941v4, §§2–3.2, лемма 2.1 и алгоритм 4. https://arxiv.org/html/1805.10941v4 (дата обращения: 04.11.2026). ↑
Служебный блок
- Версия
- 4.0
- Факты проверены
- Подготовка
- Редакция Медиатрона
- Публикация
- утверждена владельцем издания 5 ноября 2026 г.
Редакция Медиатрона. Факты сверены с первоисточниками на дату проверки, публикация утверждена владельцем издания.
Нашли ошибку? info@mediatrone.ru