Обновлено:

Рандомное число

Чтобы получить рандомное число в программировании, чаще всего вызывают Math.random(). Но за этой простой функцией скрывается целый мир алгоритмов, различающихся по скорости, безопасности и принципам работы. В 2026 году понимание этих различий критично для разработчиков, игровых сервисов и финансовых приложений.

Псевдослучайные vs истинно случайные числа

Генератор псевдослучайных чисел (ГПСЧ, PRNG) использует математический алгоритм и начальное число (seed). По этому seed вычисляется вся последовательность. Если seed известен, последовательность можно точно воспроизвести. Это делает ГПСЧ быстрым, но не безопасным для криптографии.

Генератор случайных чисел (ГСЧ, TRNG) берёт данные из физических источников энтропии: тепловой шум процессора, время сетевых пакетов, движение мыши. Эти данные невозможно предсказать, что делает ГСЧ криптографически стойким, но более медленным и ресурсоёмким.

Диапазон значений
Режим генерации ГПСЧ vs ГСЧ
Формат результата

Результат

Ожидаем ввода

История и статистика (кликните для просмотра)
Пока пусто

Калькулятор выше генерирует числа на базе алгоритмов ГПСЧ. Вы задаете диапазон (например, от 1 до 100) и получаете результат. Такой инструмент полезен для игр, тестирования, учебных задач – но не для создания секретных ключей.

Как работают алгоритмы ГПСЧ

Простейший ГПСЧ можно написать в несколько строк кода. Например, линейный конгруэнтный метод (LCPRNG) описывается формулой:

Xₙ₊₁ = (a × Xₙ + c) mod m

где:

  • Xₙ – текущее состояние (seed)
  • a – множитель (например, 45)
  • c – приращение (например, 21)
  • m – модуль (например, 67)

Реализация на JavaScript:

const a = 45;
const c = 21;
const m = 67;
let seed = 2;

const rand = () => (seed = (a * seed + c) % m);

// Генерируем 10 чисел
for (let i = 0; i < 10; i++) console.log(rand());

Этот алгоритм использовался в ранних языках программирования. Его последовательность полностью определяется начальным seed и параметрами a, c, m. Для разных seed получаются разные последовательности, но внутри каждой последовательность предсказуема.

Что внутри Math.random()

В JavaScript Math.random() возвращает дробное число от 0 (включительно) до 1 (не включая 1). До 2026 года в браузерах использовались разные алгоритмы:

  • MWC1616 (использовался в Chrome до версии 49): комбинировал два 32ーブit состояния для генерации чисел.
  • Xorshift128+ (современный алгоритм): работает с 64ーブit состояниями, даёт лучшее распределение и скорость.

Алгоритм выбирается движком JavaScript (V8, SpiderMonkey, etc.) и не контролируется разработчиком. Начальное seed устанавливается внутренне и не может быть задано или изменено из кода.

Проблема предсказуемости: если знать алгоритм и текущее состояние, можно предсказать следующие числа. В 2018 году существовала задача, где требовалось предсказать значение Math.random() medium.com. Это демонстрирует, что Math.random() не подходит для безопасности.

Криптографически стойкие случайные числа

Для безопасности используйте crypto.getRandomValues() из Web Crypto API. Этот метод получает энтропию из системных источников (ЦПУ, сеть, др.) и даёт истинно случайные числа.

Пример генерации случайного байта:

let randomValues = crypto.getRandomValues(new Uint8Array(1));
console.log(randomValues[0]); // число от 0 до 255

Разница в применении:

Math.random()crypto.getRandomValues()
ГПСЧ, предсказуемГСЧ, криптографически стойкий
Быстрый, легкийРесурсоёмкий, медленнее
Для игр, тестов, демоДля паролей, ключей, токенов
Не требует seedИспользует системную энтропию

Практическое применение: как генерировать числа в нужном диапазоне

Часто требуется не дробное число от 0 до 1, а целое в конкретном диапазоне. Например, случайное число от 5 до 15.

// Дробное число от min до max
function randomFloat(min, max) {
  return Math.random() * (max - min) + min;
}

// Целое число от min до max (включительно)
function randomInt(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

// Пример: целое число от 5 до 15
let num = randomInt(5, 15);

Для криптографически безопасного целого числа используйте crypto.getRandomValues() с масштабированием.

Где используются рандомные числа

  • Игры и лотереи: выбор случайного предмета, перемешивание карт, генерация ландшафта.
  • Тестирование: создание случайных входных данных для проверки программ.
  • Моделирование: финансовые модели, научные эксперименты, прогнозы.
  • Криптография: генерация ключей шифрования, одноразовых паролей, токенов.
  • Выборка: случайный выбор пользователей для опроса, A/B тестирования.

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

Будущее генераторов случайных чисел

С развитием WebAssembly и более мощных API в JavaScript появляется возможность использовать более сложные алгоритмы ГПСЧ с настраиваемым seed (например, для воспроизводимости в тестах). Также растёт доступность истинных ГСЧ через аппаратные источники энтропии (TPM, специальные датчики).

Понимание разницы между Math.random() и crypto.getRandomValues() позволяет выбирать правильный инструмент для задачи – скорость или безопасность.

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

Можно ли предсказать результат Math.random()?

Да, Math.random() генерирует псевдослучайные числа (ГПСЧ) по фиксированному алгоритму. Если знать начальное значение (seed) и алгоритм, последовательность можно воспроизвести. Это не годится для криптографии.

Чем отличается псевдослучайное число от истинно случайного?

Псевдослучайное число создаётся алгоритмом на основе начального значения, его последовательность предсказуема. Истинно случайное число основано на физической энтропии (шум процессора, сетевые пакеты) и непредсказуемо.

Как получить рандомное целое число в диапазоне от 1 до 100?

В JavaScript используйте Math.floor(Math.random() * 100) + 1. Math.random() даёт дробное число от 0 до 1, умножение на 100 масштабирует диапазон, Math.floor() округляет вниз, +1 смещает начало.

Когда нужны криптографически безопасные случайные числа?

При генерации паролей, ключей шифрования, токенов безопасности, в онлайн-гейминг с денежными ставками. Используйте crypto.getRandomValues(), а не Math.random().

  1. Генератор рандомных чисел онлайн
  2. Рандомный код: генерация случайных чисел в JavaScript
  3. Генератор чисел от 1 до N онлайн
  4. Рандомайзер чисел без повторения цифр онлайн
  5. Рандомайзер чисел – колесо фортуны онлайн
  6. Рандомайзер от 1 до 50 – сгенерировать число онлайн