Генерация случайных чисел

JavaScript:
Генерация случайных чисел

Как:

Базовая генерация случайных чисел

Самый простой способ генерации случайного числа в JavaScript — использовать Math.random(). Эта функция возвращает псевдослучайное число с плавающей точкой в диапазоне от 0 (включительно) до 1 (исключая).

let randomNumber = Math.random();
console.log(randomNumber);

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

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

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

console.log(getRandomInt(1, 100));

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

Для приложений, требующих более высокой степени случайности (например, криптографические операции), можно использовать метод crypto.getRandomValues(). Этот метод обеспечивает криптографическую случайность, в отличие от псевдослучайных чисел, генерируемых с помощью Math.random().

(function generateSecureRandom() {
  let array = new Uint32Array(1);
  window.crypto.getRandomValues(array);
  console.log(array[0]);
})();

Погружение в детали

Исторически генерация случайных чисел в JavaScript полагалась исключительно на функцию Math.random(). Хотя она удобна для большинства повседневных случаев использования, ее алгоритм, обычно являясь вариантом генератора псевдослучайных чисел (PRNG), например, Mersenne Twister, не обеспечивает криптографическую безопасность.

Появление API веб-криптографии привело к введению метода crypto.getRandomValues(), предлагающего способ генерации чисел, которые гораздо менее предсказуемы и подходят для приложений, чувствительных к безопасности. Этот метод использует источники случайности операционной системы, такие как /dev/random в Unix/Linux, которые более надежны и подходят для криптографических операций.

Крайне важно выбирать правильный метод для конкретной задачи. Math.random() подходит для базовых потребностей, таких как простые игры, анимации или любой случай, когда качество случайности не критично. Однако для безопасности, например, при создании токенов сброса пароля или любых криптографических операций, crypto.getRandomValues() является лучшим выбором из-за его высокого качества случайности.

Заметим, что Math.random() в большинстве реализаций генерирует числа с известным смещением, что означает, что некоторые числа появляются чаще других. Хотя это смещение минимально и часто незаметно для общих приложений, оно дисквалифицирует Math.random() для использования в любом криптографическом контексте или приложениях, где критична справедливость, например, в онлайн-азартных играх.

В заключение, хотя встроенные функции JavaScript для генерации случайных чисел покрывают широкий спектр потребностей, понимание различий и ограничений каждого метода существенно для их соответствующего применения.