Как генерировать случайные числа с помощью math random javascript

Случайные числа часто используются в программировании для создания игр, имитационного моделирования, генерации паролей и многого другого. В этой статье мы подробно разберем, как генерировать псевдослучайные числа в JavaScript с помощью встроенного math random.

Обзор math random в JavaScript

Math.random() - это встроенная функция в JavaScript, которая возвращает псевдослучайное число с плавающей точкой от 0 до 1. Синтаксис прост:

Math.random();

Этот метод не принимает никаких аргументов. Каждый раз при вызове он генерирует новое псевдослучайное число.

Например:

Math.random(); // 0.4011148700956238
Math.random(); // 0.8567125649316042

Как видно из примеров, возвращаемое число всегда больше или равно 0 и строго меньше 1.

Псевдослучайность

Несмотря на название, math random генерирует не полностью случайные, а псевдослучайные числа. Это означает, что числа генерируются детерминированным алгоритмом на основе начального состояния. Хотя последовательность кажется случайной, ее можно воспроизвести, если известно начальное состояние генератора.

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

Реализация в браузерах

Конкретный алгоритм генерации псевдослучайных чисел выбирается браузером. Начиная с 2015 года, большинство используют алгоритм xorshift128+.

Этот алгоритм реализован в движках:

  • Firefox
  • Safari
  • Chrome и другие браузеры на основе V8

Таким образом, поведение math random стандартизировано в современных браузерах.

Генерация случайного числа в заданном диапазоне

Хотя по умолчанию math random генерирует числа от 0 до 1, часто нужны случайные числа в другом диапазоне. Допустим, для игры нам нужно число от 1 до 6 или для имитационной модели - значения от 20 до 50.

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

Генерация числа от 0 до N

Чтобы получить случайное число от 0 до N, нужно умножить результат math random на N:

let n = 10; let random = Math.random() * n;

Теперь random будет числом от 0 до 10.

Генерация числа от M до N

А если нужен диапазон от M до N? Тогда сначала вычисляем разность между границами:

let m = 20; let n = 50; let diff = n - m;

А затем используем эту разность, чтобы сместить случайное число в нужный диапазон:

let random = Math.random() * diff + m;

Теперь random будет в интервале от 20 до 50.

Примеры диапазонов

Рассмотрим несколько примеров генерации случайных чисел в разных диапазонах:

// От 10 до 20 let random = Math.random() * 10 + 10; // От -5 до 5 let random = Math.random() * 10 - 5; // От 1 до 10, не включая 10 let random = Math.random() * 9 + 1;

Последний пример показывает, как сгенерировать случайное число, исключая верхнюю границу диапазона. Для этого вычитаем 1 при вычислении разности.

Типичные ошибки

Часто допускают такую ошибку:

// НЕПРАВИЛЬНО let random = Math.random() * (n - m) + n;

Здесь разность вычисляется неверно, из-за чего распределение получается неравномерным. Правильный вариант:

// ПРАВИЛЬНО let random = Math.random() * (n - m) + m;

Генерация случайного целого числа

Часто нужно сгенерировать не дробное, а целое случайное число. Это легко сделать с помощью Math.floor.

Например, чтобы получить число от 0 до 10, можно написать:

let n = 10; let random = Math.floor(Math.random() * n);

Math.floor отбрасывает дробную часть, оставляя целое случайное число.

Целые числа в заданном диапазоне

Аналогичным образом генерируются случайные целые числа в произвольном диапазоне от M до N:

let m = 10; let n = 100; let random = Math.floor(Math.random() * (n - m + 1)) + m;

Здесь важно прибавить 1 при вычислении длины диапазона, чтобы верхняя граница тоже включалась.

Включение границ диапазона

Иногда нужно сгенерировать число в диапазоне от M до N, где обе границы включаются. Для этого используем формулу:

let random = Math.floor(Math.random() * (n - m + 1)) + m;

Например, чтобы получить число от 10 до 20 включительно:

let m = 10; let n = 20; let random = Math.floor(Math.random() * (n - m + 1)) + m;

Этот прием гарантирует равновероятность всех чисел в диапазоне.

Равномерное распределение случайных чисел

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

К сожалению, наивные методы генерации часто приводят к смещению распределения. Рассмотрим пример:

let random = Math.round(Math.random() * 6);

Здесь мы генерируем число от 0 до 6 и округляем результат. Казалось бы, должны получить равновероятное распределение. Но на практике число 3 будет появляться чаще остальных.

В чем проблема? Дело в округлении. Из-за него число 3 получается из большего количества исходных значений (от 2.5 до 3.4), чем остальные числа.

Способы обеспечения равномерности

Чтобы избежать смещения распределения, нужно:

  1. Вычислять длину диапазона правильно
  2. Использовать Math.floor вместо Math.round
  3. Генерировать большие числа и отображать в нужный диапазон

Например, вместо примера выше лучше написать:

let random = Math.floor(Math.random() * 6);

Теперь все значения будут появляться с одинаковой частотой.

Тестирование равномерности

Чтобы убедиться в равномерности распределения, можно запустить генератор большое число раз и подсчитать частоту для каждого значения:

let counts = {}; for (let i = 0; i < 100000; i++) { let random = Math.floor(Math.random() * 6); counts[random] = (counts[random] || 0) + 1; } console.log(counts);

Если распределение равномерно, количество попаданий в каждый диапазон должно быть примерно одинаковым.

Применение math random

Рассмотрим несколько практических примеров использования math random в JavaScript.

Генерация случайных элементов массива

Частая задача - выбрать случайный элемент массива. Это легко сделать так:

let items = [1, 2, 3, 4]; let randomIndex = Math.floor(Math.random() * items.length); let randomItem = items[randomIndex];

Сначала генерируем случайный индекс, а затем получаем элемент с этим индексом.

Случайный выбор из нескольких вариантов

Допустим, есть несколько вариантов, и нужно выбрать один случайным образом:

let options = ['rock', 'paper', 'scissors']; let randomIndex = Math.floor(Math.random() * options.length); let randomChoice = options[randomIndex];

Этот прием часто используется в играх типа "камень-ножницы-бумага".

Имитационное моделирование

С помощью math random можно имитировать случайные процессы. Например, моделирование бросания игральных костей:

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

Или имитация блуждания частицы:

let x = 0; let y = 0; for (let i = 0; i < 100; i++) { let direction = Math.floor(Math.random() * 4); if (direction == 0) x++; if (direction == 1) x--; if (direction == 2) y++; if (direction == 3) y--; }

Здесь частица каждый шаг перемещается в случайном направлении.

Альтернативы math random

Хотя math random удобен для многих задач, иногда требуются другие варианты генераторов случайных чисел.

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

Если нужна криптографическая стойкость, следует использовать window.crypto.getRandomValues(). Этот API предоставляет доступ к более надежным источникам энтропии, чем math random.

Итак, статья будет полезна тем, кто занимается программированием, чтобы понять, как генерировать случайные числа с помощью math random javascript. Эта информация ускорит процесс работы, позволит избежать трудностей.

Комментарии