Обновлено:
Рандом цифр
Нужно выбрать победителя конкурса, сгенерировать пароль или протестировать алгоритм на произвольных данных – во всех случаях требуется рандом цифр. Проблема в том, что «случайность» в компьютерах не случайна, а диапазоны и условия каждый раз разные. Ниже – формулы, примеры кода и онлайн-калькулятор, который выдаст готовое число за секунду.
Что такое генерация случайных чисел
Рандом цифр – это процесс получения числа из заданного диапазона, где у каждого значения равная вероятность выпадения. В программировании это делают через генераторы псевдослучайных чисел (PRNG – Pseudo-Random Number Generator). Они вычисляют результат по математической формуле от начального значения – сида (seed). Последовательность выглядит случайной, но при одном и том же сиде воспроизводится полностью [thecode.media].
Истинно случайные числа получают из физических процессов: тепловой шум процессора, радиоактивный распад, атмосферные помехи. Такие генераторы стоят в криптографических модулях и аппаратных ключах.
Как получить случайное число в диапазоне
Базовый метод Math.random() в JavaScript возвращает число с плавающей точкой от 0 включительно до 1 не включительно – то есть 0 ≤ x < 1. Чтобы получить рандом цифр в нужном диапазоне, значение масштабируют и сдвигают.
Целые числа
Формула для целого числа от min до max включительно:
Math.floor(Math.random() * (max - min + 1)) + min
Разбор по шагам:
Math.random()даёт число от 0 до 0,999…- Умножение на
(max - min + 1)растягивает диапазон до нужной длины Math.floor()округляет вниз до целого+ minсдвигает начало диапазона от нуля к минимуму
Почему +1? Без него max никогда не выпадет – Math.random() не возвращает 1, а Math.floor() всегда округляет вниз [thecode.media].
Примеры:
| Задача | Вызов | Результат |
|---|---|---|
| От 1 до 10 | Math.floor(Math.random() * 10) + 1 | 1, 2, …, 10 |
| От 0 до 99 | Math.floor(Math.random() * 100) | 0, 1, …, 99 |
| Орёл или решка | Math.floor(Math.random() * 2) | 0 или 1 |
| Бросок кубика | Math.floor(Math.random() * 6) + 1 | 1, 2, …, 6 |
Дробные числа
Для дробного числа от min до max без контроля точности:
Math.random() * (max - min) + min
С контролем знаков после запятой:
function getRandomFloat(min, max, decimals = 2) {
const random = Math.random() * (max - min) + min;
return parseFloat(random.toFixed(decimals));
}
// Дробное от 5,5 до 7,8 с двумя знаками
getRandomFloat(5.5, 7.8, 2); // 6.37
Метод .toFixed() возвращает строку, поэтому parseFloat() преобразует обратно в число [thecode.media].
Практические задачи с рандомом цифр
Случайный выбор из массива
Умножьте Math.random() на длину массива, округлите вниз – получите валидный индекс:
const items = ['А', 'Б', 'В', 'Г', 'Д'];
const randomItem = items[Math.floor(Math.random() * items.length)];
Подходит для ротации баннеров, вывода случайных цитат, выбора победителя из списка.
Генерация случайного цвета
HEX-формат – число от 0 до 16 777 215 (0xFFFFFF), переведённое в шестнадцатеричную систему:
function getRandomHexColor() {
const hex = Math.floor(Math.random() * 0xffffff).toString(16);
return `#${hex.padStart(6, '0')}`;
}
RGB-формат – три отдельных канала от 0 до 255:
function getRandomRgbColor() {
const r = Math.floor(Math.random() * 256);
const g = Math.floor(Math.random() * 256);
const b = Math.floor(Math.random() * 256);
return `rgb(${r}, ${g}, ${b})`;
}
Оба формата описывают 16 777 216 цветов (256 × 256 × 256) [thecode.media].
Быстрая генерация ID
Без сторонних библиотек можно получить случайную строку из 8 символов:
const id = Math.random().toString(36).substring(2, 10);
// "k3j9f2x1"
.toString(36) переводит число в буквенно-цифровой формат (цифры + латинские буквы), .substring(2, 10) убирает «0.» и берёт 8 символов. Подходит для прототипов и моковых данных, но не для продакшен-идентификаторов – возможны коллизии [thecode.media].
Когда Math.random() не подходит
Метод Math.random() – псевдослучайный генератор. Если известен алгоритм и внутреннее состояние, последовательность восстанавливается. Это делает его непригодным для задач, где важна криптографическая стойкость:
- генерация паролей и токенов доступа
- создание ключей шифрования
- CSRF-токены и секреты сессий
Для этих целей в браузере используют crypto.getRandomValues(), в Node.js – crypto.randomBytes(). Они получают энтропию от операционной системы и устойчивы к предсказанию.
Статья носит информационный характер. Для криптографической защиты данных используйте сертифицированные библиотеки и следуйте рекомендациям стандартов.
Какой генератор выбрать
| Критерий | Math.random() | crypto.getRandomValues() |
|---|---|---|
| Скорость | Быстрый | Медленнее |
| Предсказуемость | Теоретически предсказуем | Непредсказуем |
| Подходит для | Игры, тесты, UI, прототипы | Пароли, токены, ключи |
| Доступность | Все JS-среды | Браузер + Node.js |
Для бытовых задач – рандом цифр для розыгрыша, тестовых данных, игровых механик – Math.random() достаточно. Для безопасности – только криптографически стойкие генераторы.
Частые ошибки при работе с рандомом
- Забыли
+1в формуле целых чисел – максимальное значение никогда не выпадет. - Использовали
Math.round()вместоMath.floor()– крайние значения (min и max) выпадают с вдвое меньшей вероятностью, чем промежуточные. - Пытались получить рандом цифр умножением на
max– приmax = 10иMath.random() = 0.999…результатMath.floor(0.999… × 10)даст 9, а не 10. - Использовали
Math.random()для паролей – предсказуемая энтропия, уязвимость к брутфорсу.
Проверяйте формулу на границах: подставьте Math.random() = 0 и Math.random() = 0.999…, чтобы убедиться в корректности диапазона.
Часто задаваемые вопросы
Чем псевдослучайные числа отличаются от истинно случайных?
Псевдослучайные числа вычисляются по детерминированному алгоритму и воспроизводимы при одном и том же начальном значении. Истинно случайные получают из физических процессов – теплового шума, радиоактивного распада – и повторить невозможно.
Можно ли предсказать результат Math.random()?
Теоретически да: если известен алгоритм генератора и его внутреннее состояние, последовательность восстанавливается. На практике без доступа к состоянию это крайне сложно, но для криптографии Math.random() не используют.
Как сгенерировать случайное число без повторений?
Создайте массив всех возможных значений, перемешайте его (алгоритм Фишера – Йетса) и берите элементы по порядку. Это гарантирует уникальность каждого числа в выборке.
Почему рандом иногда выдаёт одинаковые числа подряд?
Случайность не исключает повторов – это особенность равномерного распределения. Если бросать кубик, шестёрка может выпасть дважды или трижды подряд. Длинные серии одинаково вероятны, как и любые другие комбинации.
Какой генератор использовать для паролей и токенов?
Только криптографически стойкие: crypto.getRandomValues() в браузере или crypto.randomBytes() в Node.js. Они получают энтропию от операционной системы и подходят для защиты данных.
Похожие калькуляторы и статьи
- Random случайные числа онлайн – генератор и примеры
- Рандомно 2 числа: генерация случайных чисел в JavaScript
- Рандомайзер до 2: генератор случайных чисел 0, 1, 2 онлайн
- Случайное трехзначное число: генерация в JavaScript и онлайн-калькулятор
- Случайное число от 0: формулы и генератор на JavaScript
- Случайное натуральное число: генерация и формулы