Случайные целые числа
Случайные целые числа – это числа из заданного диапазона, выбранные без видимой закономерности. Они используются в криптографии, лотереях, научных симуляциях, тестировании ПО и играх. Без них невозможна генерация ключей шифрования, выбор победителя розыгрыша или моделирование методом Монте-Карло.
Проблема в том, что компьютеры детерминированы: при одинаковых входных данных они выдают одинаковый результат. Поэтому «случайность» в программах бывает двух типов – псевдослучайная и истинная.
Как работают генераторы случайных чисел
Псевдослучайные числа (ГПСЧ)
Генератор псевдослучайных чисел (ГПСЧ, PRNG) – алгоритм, который вычисляет последовательность чисел по формуле. Результат выглядит случайным, но полностью определяется начальным значением – seed. Один и тот же seed даёт одну и ту же последовательность medium.com.
Самый распространённый алгоритм – линейный конгруэнтный ГПСЧ (LCPRNG). Формула:
Xₙ₊₁ = (a × Xₙ + c) mod m
Где:
- a – множитель
- c – приращение
- m – модуль
- X₀ – начальное значение (seed)
При a = 45, c = 21, m = 67 и seed = 2 последовательность: 44, 14, 8, 52, 19, 35… Каждое число вычисляется из предыдущего, и зная параметры, можно предсказать всю цепочку.
Плюсы ГПСЧ:
- Быстрый расчёт
- Воспроизводимость при фиксированном seed
- Подходит для тестов, анимаций, процедурной генерации
Минусы:
- Предсказуемость – непригоден для криптографии
- Периодичность – последовательность повторяется через m итераций
Истинно случайные числа (ГСЧ)
Генератор случайных чисел (ГСЧ, TRNG) получает данные из физических источников энтропии – меры беспорядка и непредсказуемости. Источники: тепловой шум полупроводников, тайминги нажатий клавиш, перемещения мыши, температура процессора medium.com.
В браузере истинная случайность доступна через crypto.getRandomValues(), в Linux – через /dev/random. Эти методы медленнее ГПСЧ, но криптографически стойки.
Как получить случайное целое число в диапазоне
Для генерации случайного целого числа от A до B включительно используется формула:
result = floor(random() × (B - A + 1)) + A
Разберём на примере – число от 10 до 50:
random()даёт число от 0 до 0,999…- Умножаем на 41 (50 − 10 + 1) → получаем от 0 до 40,999…
floor()отбрасывает дробную часть → от 0 до 40- Прибавляем 10 → от 10 до 50
Калькулятор выше автоматически выполняет этот расчёт – укажите минимальное и максимальное значение.
Примеры для популярных диапазонов
| Диапазон | Формула (JavaScript) | Результат |
|---|---|---|
| От 1 до 10 | Math.floor(Math.random() * 10) + 1 | Целое 1–10 |
| От 0 до 99 | Math.floor(Math.random() * 100) | Целое 0–99 |
| От 1 до 100 | Math.floor(Math.random() * 100) + 1 | Целое 1–100 |
| От 1000 до 9999 | Math.floor(Math.random() * 9000) + 1000 | 4-значный пин |
Где применяются случайные целые числа
Криптография и безопасность
Генерация ключей шифрования, SSL-сертификатов, одноразовых паролей (OTP), токенов сессий. Здесь используют только криптографически стойкие ГСЧ – предсказуемость ключа ведёт к взлому.
Лотереи и розыгрыши
Выбор победителя из списка участников, генерация лотерейных билетов. Требуется прозрачность и невозможность подделки – часто привлекают независимых аудиторов.
Научные симуляции
Метод Монте-Карло, моделирование молекулярной динамики, стохастические процессы. Учёным важна воспроизводимость – поэтому используют ГПСЧ с фиксированным seed.
Тестирование ПО
Генерация случайных входных данных для fuzz-тестирования, нагрузочного тестирования, проверки граничных условий. Фиксированный seed помогает воспроизвести упавший тест.
Игры и развлечения
Броски кубиков, распределение карт, лутбоксы, процедурная генерация ландшафтов. В играх чаще используют ГПСЧ – скорость важнее криптографической стойкости.
Можно ли предсказать случайные числа?
ГПСЧ предсказуем по определению. В Chrome до версии 49 использовался алгоритм MWC1616 – зная два последовательных значения Math.random(), можно было вычислить внутреннее состояние и предсказать все следующие числа medium.com. Визуально это проявлялось как неравномерное распределение пикселей на сгенерированных изображениях.
С 2016 года V8 перешёл на xorshift128+ – алгоритм с лучшим распределением, но всё равно предсказуемый при наличии 64-битной арифметики. Для задач безопасности всегда используйте crypto.getRandomValues().
Как проверить качество случайных чисел
Случайная последовательность должна проходить статистические тесты:
- Равномерность – каждое число из диапазона появляется с одинаковой частотой
- Независимость – знание предыдущих чисел не помогает предсказать следующее
- Период – длина последовательности до первого повторения (чем больше, тем лучше)
- Тест χ² (хи-квадрат) – проверяет соответствие распределения теоретическому
Для быстрой проверки можно сгенерировать 10 000 чисел от 1 до 10 и подсчитать частоту каждого – при равномерном распределении каждое значение встретится около 1 000 раз с отклонением ±3–5%.
Статья носит информационный характер. Для криптографических задач уточняйте актуальные стандарты и рекомендации регуляторов.