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;
}
Как это работает:
Math.random()→ число в [0, 1).- Умножаем на
(max - min + 1)– длину диапазона. Math.floorотбрасывает дробную часть, получаем целое от 0 до(max - min).- Прибавляем
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 в разных языках программирования
Хотя синтаксис различается, концепция везде одна:
- JavaScript –
Math.random()→ float в [0, 1). - Python – модуль
random:random.random(),randint(a, b),choice(seq)и др. - C# – класс
Random:Next(),Next(min, max),NextDouble(). - Java –
java.util.Randomи более современные генераторы (SplittableRandom,SecureRandom). - C++ –
<random>:std::mt19937и распределения (uniform_int_distribution,normal_distributionи др.).
Везде действуют одни принципы:
- обычные генераторы – псевдослучайные, быстрые, но предсказуемые;
- отдельные API помечены как криптографические и основаны на системных источниках энтропии.
Типичные ошибки при работе со случайными числами
Неправильные границы диапазона.
Забывают про полузакрытый интервал [0, 1) и пишут формулы без+1, из‑за чего верхняя граница никогда не выпадает.Пересоздание генератора слишком часто.
В ряде языков (например, C#, Java) созданиеRandomв цикле с одинаковым seed по времени даёт одинаковые последовательности. Обычно генератор создают один раз и переиспользуют.Использование PRNG там, где нужен TRNG.
ИспользованиеMath.randomдля токенов восстановления, БД‑ключей, временных паролей – серьёзная уязвимость.Оценка «случайности» по коротким выборкам.
То, что число выпало несколько раз подряд, не означает «сломанный рандом» – это нормальное поведение при достаточном количестве испытаний.
Онлайн‑генератор на этой странице и приведённые формулы закрывают большинство бытовых задач: от выбора победителя до броска кубика и учебных проектов. Для криптографии и защиты данных всегда используйте специализированные криптографические генераторы.
Часто задаваемые вопросы
Чем отличаются случайные и псевдослучайные числа?
Можно ли использовать Math.random или Random для генерации паролей?
Как проверить, что генератор случайных чисел работает корректно?
Зачем в формулах random используется Math.floor и «+1» к диапазону?
Почему в генераторе на странице иногда повторяются числа?
Что такое seed генератора случайных чисел и зачем он нужен?
Похожие калькуляторы и статьи
- Случайное натуральное число: генерация и формулы
- Что такое рандомное число: генераторы, алгоритмы и применение
- Рандомный код: генерация случайных чисел в JavaScript
- Рандомайзер чисел с исключением числа из диапазона
- Случайное число от 0: формулы и генератор на JavaScript
- Заполнить случайными числами: онлайн и в коде