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

Генерируем случайные числа в JavaScript

Где конкретно востребована генерация:

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

В реальности существуют разные способы генерации, выбор которых зависит от конкретного программного приложения. О них — наша статья.

Базовая генерация в JS

Наиболее простой способ получить random-число — это хорошо известный метод Math.random(), который встроен в JavaScript.

Math.random()

Пример вывода:

0.5097055147211202

На практике метод Math.random() всегда осуществляет возврат числа с плавающей точкой в диапазоне между 0 и 1. Технически, это число может быть и нулем, однако оно точно никогда не будет равно 1.

Так как метод очень популярен в использовании, его нередко помещают внутрь функции:

function show_random_number() {
  var random_number = Math.random(); // generate random number between 0 and 1
}

Основной недостаток вышесказанного — функция будет создавать рандомное значение лишь в пределах весьма ограниченного диапазона. Но это не значит, что других путей генерации не существует.

Генерация между числами: максимальные и минимальные значения (max, min)

Для добавления данной функциональности без математики не обойтись.

Генерируем случайные числа в JavaScript

Также никто не мешает сгенерировать рандомное целое число в диапазоне, включая максимальное и минимальное.

Генерируем случайные числа в JavaScript

Подбрасываем монету (true либо false)

Иногда нужно просто получить орел или решку, то есть, по сути, 0 либо 1. Для этого пригодится простой код:

function coinRandom() {
  return Math.floor(Math.random() * 2);
}
coinRandom();

Если же надо получить конкретно true либо false, то код следует немного изменить:

function coinRandom() {
  return (Math.floor(Math.random() * 2) === 0);
}
coinRandom();

>false

Также можно ассоциировать нужные слова со сторонами монеты, то есть вспоминаем пресловутые орел или решка (heads or tails).

function coinRandom() {
  return (Math.floor(Math.random() * 2) === 0) ? " heads" : " tails";
}
coinRandom();

> tails

Пример генерации с исключениями

Этот метод работает для ограниченного диапазона целых чисел. Создается массив (array) числовых значений, которые интересуют, далее осуществляется выборка.

var numPool = [ 1, 5, 9, 13 ],
rand = numPool[Math.floor(Math.random() * numPool.length)];

Можно все это сделать более динамичным, добавив массив с целыми числами, которые надо исключить, а также пустой массив с результатом фильтрации 1-го во 2-ой.

Генерируем случайные числа в JavaScript

Потом следует:

  • создать цикл по массиву numPool;
  • выполнить проверку, существует ли случайное число в нашем массиве исключений excludePool;
  • поместить результат в массив filteredPool.
Генерируем случайные числа в JavaScript

По итогу отобразится случайное число из массива, который был отфильтрован.

Генерируем случайные числа в JavaScript

Генерируем случайное и неповторяющееся число

Когда речь идет о небольших наборах чисел, можно поступить следующим образом:

  • создаем array, заполненный элементами;
  • тасуем эти элементы рандомным образом;
  • помещаем результаты в новый массив;
  • извлекаем перетасованные элементы 1 раз:
Генерируем случайные числа в JavaScript

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

Генерируем случайные числа в JavaScript

В вышеописанном коде numReserve заполнен двенадцатью рандомными значениями в диапазоне от 0 до 1000. Числа потом можно получить из массива.

Пару слов о криптографии

Выше мы показали ряд методов, однако их будет недостаточно, если идет разговор о создании функций с криптографической защитой. Для этих целей можно задействовать Web Cryptography API и создать типизированный array:

Генерируем случайные числа в JavaScript

То есть мы создаем массив, где есть восемь слотов, причем каждый из них способен содержать 16-битное беззнаковое целое число. Можно выбрать и другие варианты:

  • int16Array,
  • Int8Array,
  • Uint8Array,
  • Int32Array,
  • Uint32Array.

Теперь мы можем заполнить array рандомными числами конкретного типа:

Генерируем случайные числа в JavaScript

Пример выборки следующий:

Генерируем случайные числа в JavaScript

У Web Cryptography API — хорошая поддержка в современных веб-браузерах, хотя иногда нужно использовать префиксы.

Хотите получить более глубокие знания по JavaScritpt? Обратите внимание на курсы по JS в Otus!

Генерируем случайные числа в JavaScript

При подготовке статьи использовались следующие материалы:

  • http://thenewcode.com/82/Recipes-for-Randomness-in-JavaScript;
  • https://habr.com/ru/company/ruvds/blog/534108/.