Обновлено:

Random случайные числа

Зачем вообще нужны random случайные числа

Нужно честно разыграть приз, выбрать случайного победителя, бросить виртуальный кубик или получить непредсказуемый ID в коде – во всех этих задачах появляется запрос «random случайные числа».

Часть задач решается простым онлайн‑генератором, часть – функциями random() и Math.random() в программировании. Ниже – и теория, и практические формулы.

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

В обиходе под «рандомом» понимают любые непредсказуемые результаты. Формально различают два вида:

  • истинно случайные числа – получаются из физического источника шума;
  • псевдослучайные числа (PRNG) – вычисляются алгоритмом.

По определению, генератор псевдослучайных чисел (PRNG) – это алгоритм, который выдаёт последовательность чисел, похожую на случайную и подчиняющуюся заданному распределению (обычно равномерному) medium.com.

Ключевые идеи:

  • Генератор стартует с начального значения (seed).
  • На каждом шаге применяется формула, которая по текущему состоянию выдаёт следующее число и новое состояние.
  • Если повторить тот же seed, получится та же последовательность – поэтому она «псевдо»‑случайная.

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

Как работает генератор псевдослучайных чисел (PRNG)

Базовая идея PRNG проста: есть текущее состояние (обычно целое число большой разрядности) и функция, которая переводит его в новое состояние.

Один из классических вариантов – линейный конгруэнтный генератор (LCG), подробно разбираемый на примере JavaScript в medium.com:

\[ X\_{n+1} = (a \cdot X_n + c) \bmod m \]

где:

  • \(X_n\) – текущее состояние (seed на первом шаге),
  • \(a\) – множитель (multiplier),
  • \(c\) – добавка (addend),
  • \(m\) – модуль (обычно степень 2).

Пример простейшего LCG на JavaScript:

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

function rand() {
  seed = (a * seed + c) % m;
  return seed; // целое число от 0 до m - 1
}

Такие генераторы:

  • быстрые;
  • легко реализуются;
  • предсказуемы, если знать алгоритм и состояние.

Поэтому LCG и похожие PRNG хорошо подходят для симуляций, анимаций, игр, но не для криптографии.

Как получить random случайное число в нужном диапазоне?

Чаще всего нужно не просто число от 0 до 1, а значения в конкретном промежутке: от 1 до 100, от −10 до 35, дробь с двумя знаками после запятой и т.п. На примере JavaScript это подробно демонстрируется в статье thecode.media.

Диапазон [0, 1): базовый random / Math.random

Во многих языках есть базовая функция:

  • JavaScript – Math.random();
  • Python – random.random();
  • Java – Random().nextDouble() и т.д.

В JavaScript:

Math.random(); // число с плавающей точкой в диапазоне 0 ≤ x < 1

Замечания:

  • 0 может вернуться, 1 – никогда.
  • Такой диапазон удобен для масштабирования: умножением и сдвигом его превращают в нужный интервал.

Целые числа от min до max (включительно)

Стандартная формула для JavaScript:

function getRandomInt(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

Как это работает:

  1. Math.random() → число в [0, 1).
  2. Умножаем на (max - min + 1) – длину диапазона.
  3. Math.floor отбрасывает дробную часть, получаем целое от 0 до (max - min).
  4. Прибавляем min и сдвигаем диапазон: от min до max.

Такая формула гарантирует, что и нижняя, и верхняя границы могут появиться.

Дробные числа с контролем точности

Для дробных значений используют похожий приём:

function getRandomFloat(min, max) {
  return Math.random() * (max - min) + min;
}

Чтобы задать точность (например, 2 знака после запятой):

function getRandomFloatFixed(min, max, decimals = 2) {
  const random = Math.random() * (max - min) + min;
  return parseFloat(random.toFixed(decimals));
}
  • toFixed(decimals) округляет и возвращает строку.
  • parseFloat превращает её обратно в число.

Онлайн‑генератор: случайные числа без кода

Иногда писать код не хочется – нужна просто честная «коробочка», которая выдаёт random случайные числа по заданным условиям. Для этого на странице есть калькулятор:

Быстрые пресеты
Параметры генерации
Каждое число встретится не более одного раза

Логика работы генератора:

  • задаётся минимальное и максимальное значение диапазона;
  • выбирается количество чисел;
  • опционально включается режим без повторений (каждое число не повторяется в выборке, пока есть доступные значения);
  • все числа равновероятны, распределение – равномерное в заданном промежутке.

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

Примеры использования random: от кубика до цветов

Случайный элемент массива

Классический приём из thecode.media: есть массив – выбираем случайный элемент по индексу.

const items = ['яблоко', 'груша', 'банан', 'киви', 'манго'];

const randomItem = items[Math.floor(Math.random() * items.length)];

console.log(randomItem);

items.length задаёт размер диапазона, а трик с Math.floor(random * length) даёт целый индекс от 0 до length - 1.

Бросок кубика

Цифровой шестигранный кубик:

function rollDice() {
  return Math.floor(Math.random() * 6) + 1; // 1..6
}

Комбинируя такие броски, легко моделировать настольные игры, боевые системы, выпадение лута и прочие геймплейные механики.

Случайный цвет в формате HEX

Цвет в HEX имеет 6 шестнадцатеричных символов: от #000000 до #FFFFFF. Всего 16 777 216 возможных цветов (256³), как поясняется в примере генератора цветов в thecode.media.

function getRandomHexColor() {
  const hex = Math.floor(Math.random() * 0xffffff).toString(16);
  return `#${hex.padStart(6, '0')}`;
}
  • 0xffffff – десятичное 16 777 215.
  • toString(16) переводит число в шестнадцатеричную систему.
  • padStart дополняет строку нулями слева до 6 символов.

Случайный цвет в формате RGB

Та же идея, но в компонентном виде (R, G, B – от 0 до 255):

function getRandomRgbColor() {
  const r = Math.floor(Math.random() * 256); // 0..255
  const g = Math.floor(Math.random() * 256);
  const b = Math.floor(Math.random() * 256);
  return `rgb(${r}, ${g}, ${b})`;
}

HEX и RGB представляют один и тот же цвет, просто в разных форматах записи.

Случайный ID или строка

Быстрый способ получить «рандомный» идентификатор без подключаемых библиотек:

function getRandomId(length = 8) {
  return Math.random()
    .toString(36) // числа и латинские буквы
    .substring(2, 2 + length);
}

console.log(getRandomId()); // например: "k9p4z1xs"

Это не криптостойкий ID, но отлично подходит для временных ключей, мок‑данных и прототипов.

Почему Math.random и Random не подходят для криптографии

PRNG по определению детерминированы: зная алгоритм и внутреннее состояние, можно восстановить предыдущие значения и предсказать последующие.

Для большинства задач это не проблема, но для безопасности – критично.

На практике:

  • В JavaScript Math.random() использует алгоритмы класса xorshift / MWC (в движке V8 это подробно разбирается в примере с MWC1616 и xorshift128+ на medium.com).
  • В ряде старых версий браузеров знание нескольких значений Math.random() позволяло вычислить внутреннее состояние генератора и предсказывать следующее число.
  • Аналогично, Random в C# и java.util.Random в Java не являются криптостойкими.

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

  • в браузере – window.crypto.getRandomValues(...);
  • в Node.js – модуль crypto (crypto.randomBytes);
  • в других языках – системные функции и специализированные библиотеки.

Не используйте калькулятор на странице и обычные функции random/Math.random для генерации секретных данных – они предназначены только для некритичных задач.

Настоящие случайные числа и источники энтропии

Истинные генераторы случайных чисел (TRNG) не ограничиваются алгоритмом. Они используют внешнюю энтропию:

  • шум аппаратуры (электрический, тепловой);
  • квантовые эффекты;
  • перемещения мыши, нажатия клавиш;
  • дрейф времени, колебания температуры и прочие «хаотические» параметры.

Операционные системы собирают такие данные во внутренние «пулы энтропии» и на их основе строят криптографически стойкие последовательности. Когда вы вызываете, например, crypto.getRandomValues в JavaScript, браузер запрашивает случайные байты у ОС – они уже получены с учётом аппаратных источников шума medium.com.

Плюсы TRNG:

  • высокая непредсказуемость;
  • устойчивость к атакам, основанным на знании алгоритма.

Минусы:

  • существенно медленнее PRNG;
  • сложнее реализовать и тестировать.

Поэтому в реальных системах часто комбинируют оба подхода: TRNG для начального seed, быстрый PRNG для большого количества значений.

Генераторы random в разных языках программирования

Хотя синтаксис различается, концепция везде одна:

  • JavaScriptMath.random() → float в [0, 1).
  • Python – модуль random: random.random(), randint(a, b), choice(seq) и др.
  • C# – класс Random: Next(), Next(min, max), NextDouble().
  • Javajava.util.Random и более современные генераторы (SplittableRandom, SecureRandom).
  • C++<random>: std::mt19937 и распределения (uniform_int_distribution, normal_distribution и др.).

Везде действуют одни принципы:

  • обычные генераторы – псевдослучайные, быстрые, но предсказуемые;
  • отдельные API помечены как криптографические и основаны на системных источниках энтропии.

Типичные ошибки при работе со случайными числами

  1. Неправильные границы диапазона.
    Забывают про полузакрытый интервал [0, 1) и пишут формулы без +1, из‑за чего верхняя граница никогда не выпадает.

  2. Пересоздание генератора слишком часто.
    В ряде языков (например, C#, Java) создание Random в цикле с одинаковым seed по времени даёт одинаковые последовательности. Обычно генератор создают один раз и переиспользуют.

  3. Использование PRNG там, где нужен TRNG.
    Использование Math.random для токенов восстановления, БД‑ключей, временных паролей – серьёзная уязвимость.

  4. Оценка «случайности» по коротким выборкам.
    То, что число выпало несколько раз подряд, не означает «сломанный рандом» – это нормальное поведение при достаточном количестве испытаний.


Онлайн‑генератор на этой странице и приведённые формулы закрывают большинство бытовых задач: от выбора победителя до броска кубика и учебных проектов. Для криптографии и защиты данных всегда используйте специализированные криптографические генераторы.

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

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

Случайные числа получаются из физического источника хаоса – квантовых эффектов, шумов, внешней среды – и их невозможно воспроизвести. Псевдослучайные числа вычисляет алгоритм из начального значения (seed). Последовательность выглядит хаотичной, но при том же seed полностью повторяется.

Можно ли использовать Math.random или Random для генерации паролей?

Нет, стандартные Math.random в JavaScript и Random в других языках не считаются криптографически стойкими. Их можно предсказать при знании алгоритма и состояния. Для паролей, токенов и ключей используют криптографические генераторы: в браузере – Crypto.getRandomValues, на сервере – функции ОС или спец‑библиотеки.

Как проверить, что генератор случайных чисел работает корректно?

Проводят серии тестов: смотрят распределение значений, отсутствие заметных шаблонов, серий одинаковых чисел. На практике используют стандартные статистические пакеты и наборы тестов (например, Dieharder). Для бытовых задач достаточно, чтобы все числа в диапазоне выпадали примерно одинаково часто на больших выборках.

Зачем в формулах random используется Math.floor и «+1» к диапазону?

Math.random даёт число в диапазоне [0, 1). Умножение на длину диапазона растягивает его, а Math.floor убирает дробную часть и даёт целое. При получении чисел от min до max добавляют «+1», чтобы верхняя граница тоже могла выпасть, иначе получится максимум max − 1.

Почему в генераторе на странице иногда повторяются числа?

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

Что такое seed генератора случайных чисел и зачем он нужен?

Seed – это начальное значение, с которого алгоритм псевдослучайных чисел стартует и строит всю последовательность. При одинаковом seed генератор выдаёт идентичную последовательность чисел. Это плохо для безопасности, но очень удобно для тестов, симуляций и воспроизводимых экспериментов, когда важно повторить результат.

  1. Случайное натуральное число: генерация и формулы
  2. Что такое рандомное число: генераторы, алгоритмы и применение
  3. Рандомный код: генерация случайных чисел в JavaScript
  4. Рандомайзер чисел с исключением – онлайн
  5. Случайное число от 0: формулы и генератор на JavaScript
  6. Заполнить случайными числами: онлайн и в коде