Обновлено:
Случайное натуральное число
Нужно выбрать случайного участника, сгенерировать тестовый ID или бросить виртуальный кубик – во всех случаях требуется случайное натуральное число. Натуральные числа – это положительные целые: 1, 2, 3 и далее. Нуль и отрицательные значения в этот набор не входят.
Как получить случайное натуральное число в диапазоне
Калькулятор выше генерирует случайное натуральное число от минимального до максимального значения. Под капотом работает формула, которую можно реализовать в любом языке программирования.
Формула для целых чисел от min до max
Для получения случайного натурального числа в диапазоне от min до max включительно:
Math.floor(Math.random() * (max - min + 1)) + min
Разберём по шагам:
Math.random()– возвращает число от 0 до 0,999…* (max - min + 1)– растягивает диапазон до нужного количества значенийMath.floor()– округляет вниз, отбрасывая дробную часть+ min– сдвигает начало диапазона от нуля к нужному минимуму
+1 в формуле – критичный элемент. Без него max никогда не выпадет. При min = 1, max = 10 диапазон содержит 10 чисел, а Math.random() * 9 даст значения от 0 до 8,999… – после округления и сдвига получится максимум 9.
Примеры диапазонов
| Задача | min | max | Формула |
|---|---|---|---|
| Бросок кубика | 1 | 6 | Math.floor(Math.random() * 6) + 1 |
| Случайный индекс массива | 0 | length − 1 | Math.floor(Math.random() * arr.length) |
| Номер участника от 1 до 100 | 1 | 100 | Math.floor(Math.random() * 100) + 1 |
| Случайная оценка от 1 до 5 | 1 | 5 | Math.floor(Math.random() * 5) + 1 |
| ID заказа от 1000 до 9999 | 1000 | 9999 | Math.floor(Math.random() * 9000) + 1000 |
Что такое псевдослучайность и как работает Math.random
Math.random() не создаёт настоящую случайность. Метод работает на основе генератора псевдослучайных чисел (ГПСЧ) – алгоритма, который от начального значения (seed) вычисляет последовательность чисел, выглядящих случайными, но полностью воспроизводимых при том же seed.
В движке V8 (Chrome, Node.js) Math.random() использует алгоритм xorshift128plus:
s1 ^= s1 << 23;
s1 ^= s1 >> 17;
s1 ^= s0;
s1 ^= s0 >> 26;
state1 = s1;
return state0 + state1;
Этот алгоритм быстрый и даёт равномерное распределение, но его можно обратить: наблюдая несколько последовательных значений, можно восстановить внутреннее состояние и предсказать следующие числа. До Chrome 49 использовался алгоритм MWC1616, который был ещё более уязвим – его распределение имело заметные «дыры», что подтверждалось визуально на изображениях пикселей (medium.com).
ГПСЧ vs ГСЧ: два подхода к случайности
ГПСЧ – алгоритм с формулой и seed. Быстрый, воспроизводимый, предсказуемый при известном состоянии. Подходит для игр, анимаций, тестов.
ГСЧ – берёт данные из источников энтропии операционной системы: MAC-адрес, температура CPU, шум датчиков, тайминги сетевых пакетов. Непредсказуем, но ресурсоемкий.
Для криптографии, генерации паролей и токенов авторизации Math.random() не подходит – используйте crypto.getRandomValues() из Web Crypto API.
Практические примеры генерации
Случайный выбор из списка
Выбор случайного элемента массива – одна из самых частых задач. Натуральное число используется как индекс:
const participants = ['Анна', 'Борис', 'Вика', 'Дмитрий', 'Елена'];
const winnerIndex = Math.floor(Math.random() * participants.length);
console.log(participants[winnerIndex]);
Генерация случайного HEX-цвета
Каждый канал RGB – натуральное число от 0 до 255. Генерируем три значения и комбинируем:
function randomHexColor() {
const hex = Math.floor(Math.random() * 0xffffff).toString(16);
return '#' + hex.padStart(6, '0');
}
0xFFFFFF = 16 777 215 – максимальное значение для 24-битного цвета. Результат – натуральное число от 0 до 16 777 215, преобразованное в шестнадцатеричную строку (thecode.media).
Быстрый случайный ID
Когда нужен временный идентификатор без сторонних библиотек:
const id = Math.random().toString(36).substring(2, 10);
toString(36) переводит число в буквенно-цифровой формат (0–9, a–z), substring(2, 10) убирает «0.» и берёт 8 символов. Результат не натуральное число, но строится на его основе.
Когда нужен настоящий генератор случайных чисел
crypto.getRandomValues() – метод Web Crypto API, использующий системную энтропию. Пример получения случайного натурального числа от 1 до 100:
const arr = new Uint32Array(1);
crypto.getRandomValues(arr);
const result = (arr[0] % 100) + 1;
Метод медленнее Math.random(), потому что обращается к операционной системе за энтропией. Используйте его только там, где предсказуемость создаёт риск: пароли, CSRF-токены, ключи шифрования, лотереи с реальными призами.
Статья описывает математические алгоритмы генерации чисел. Для криптографических задач и систем с юридической ответственностью проверяйте применимость каждого метода отдельно.
Как проверить равномерность распределения
При генерации тысяч чисел можно проверить, насколько равномерно они распределяются по диапазону. Для диапазона 1–10 каждое значение должно появляться примерно в 10% случаев:
const counts = {};
for (let i = 0; i < 10000; i++) {
const n = Math.floor(Math.random() * 10) + 1;
counts[n] = (counts[n] || 0) + 1;
}
console.log(counts);
Идеальное распределение: каждое число от 1 до 10 ≈ 1 000 выпадений. Отклонения ±50 при 10 000 итераций – норма для Math.random(). Существенные перекосы (например, одно число выпадает 2 000 раз) указывают на проблему алгоритма.
Воспроизводимость в тестах
ГПСЧ позволяет зафиксировать seed и получить ту же последовательность при повторном запуске. Это полезно для тестов: игра должна воспроизводить один и тот же «случайный» уровень при регрессионном тестировании. Math.random() в JavaScript не даёт установить seed – для этого нужны библиотеки вроде seedrandom.
Часто задаваемые вопросы
Чем натуральное число отличается от целого?
Натуральные числа – это положительные целые числа начиная с 1 (1, 2, 3…). Целые включают также нуль и отрицательные значения. Диапазон натуральных чисел не содержит нуля и минусов.
Почему в формуле случайного числа прибавляется +1?
Потому что Math.random() никогда не возвращает 1, а Math.floor() всегда округляет вниз. Без +1 максимальное значение диапазона никогда не выпадет – вы получите max − 1 вместо max.
Можно ли предсказать результат Math.random()?
Технически да – Math.random() использует псевдослучайный алгоритм xorshift128plus, который можно обратить при достаточном количестве наблюдений. Для криптографии он не подходит.
Что такое псевдослучайное число?
Псевдослучайное число генерируется алгоритмом от начального значения (seed) и выглядит случайным, но полностью воспроизводимо при том же seed. Настоящие случайные числа берутся из физических источников энтропии.
Какое максимальное натуральное число можно получить через JavaScript?
При работе с целыми числами предел – 2^53 − 1 (9 007 199 254 740 991). На практике диапазоны ограничиваются задачей: для индексов массива – его длина, для кубика – 6.
Чем ГПСЧ отличается от ГСЧ?
ГПСЧ (псевдослучайный) использует формулу и seed – последовательность воспроизводима. ГСЧ (настоящий случайный) берёт данные из источников энтропии ОС: температуру CPU, шум датчиков, сетевые события.