Как получить рандомное число в js
Перейти к содержимому

Как получить рандомное число в js

  • автор:

Как получить рандомное число в js

Напишите функцию randomInteger(min, max) , которая генерирует случайное целое (integer) число от min до max (включительно).

Любое число из интервала min..max должно появляться с одинаковой вероятностью.

Пример работы функции:

alert( randomInteger(1, 5) ); // 1 alert( randomInteger(1, 5) ); // 3 alert( randomInteger(1, 5) ); // 5

Можно использовать решение из предыдущей задачи.

Простое, но неправильное решение

Простое, но неправильное решение

Самое простое, но неправильное решение – генерировать случайное число от min до max и округлять его:

function randomInteger(min, max) < let rand = min + Math.random() * (max - min); return Math.round(rand); >alert( randomInteger(1, 3) );

Функция будет работать, но неправильно. Вероятность получить min и max значения в 2 раза меньше, чем любое другое число.

Если вы запустите приведённый выше пример, то заметите, что 2 появляется чаще всего.

Это происходит потому, что метод Math.round() получает случайные числа из интервала 1..3 и округляет их следующим образом:

число от 1 . до 1.4999999999 округлится до 1 число от 1.5 . до 2.4999999999 округлится до 2 число от 2.5 . до 2.9999999999 округлится до 3

Теперь становится понятно, что 1 получает в 2 раза меньше значений, чем 2 . То же самое с 3 .

Правильное решение задачи

Правильное решение задачи

Есть много правильных решений этой задачи. Одно из них – использовать Math.floor для получения случайного числа от min до max+1 :

function randomInteger(min, max) < // случайное число от min до (max+1) let rand = min + Math.random() * (max + 1 - min); return Math.floor(rand); >alert( randomInteger(1, 3) );

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

число от 1 . до 1.9999999999 округлится до 1 число от 2 . до 2.9999999999 округлится до 2 число от 3 . до 3.9999999999 округлится до 3

Все интервалы имеют одинаковую длину, что выравнивает вероятность получения случайных чисел.

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

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

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

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

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

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

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

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

На практике метод 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

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

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

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

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

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

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

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

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

Если же мы говорим о больших числовых наборах, то тут надо после создания заполнять 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/.

Метод Math.random

Метод Math.random возвращает случайное дробное число от 0 до 1 .

Синтаксис

Math.random();

Применение

Чтобы получить случайное число в определенном промежутке (дробное или целое) следует пользоваться специальными приемами. Получение случайного дробного числа между min и max происходит так:

function getRandomArbitary(min, max) < return Math.random() * (max - min) + min; >

А теперь получим случайное целое число между min и max :

function getRandomInt(min, max) < return Math.floor(Math.random() * (max - min + 1)) + min; >

Пример

Давайте выведем случайное число от 0 до 1 :

console.log(Math.random());

Результат выполнения кода:

0.5416665468657356

Пример

Давайте выведем случайное целое число от 10 до 100 :

function getRandomInt(min, max) < return Math.floor(Math.random() * (max - min + 1)) + min; >console.log(getRandomInt(10, 100));

Результат выполнения кода:

Math.random()

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

Синтаксис

 Math.random() 

У метода нет параметров.

Опубликуем результат в console.

 let randomNumber = Math.random() console.log(randomNumber) // или просто console.log(Math.random()) 

Math.random()

Особенности генерации случайных чисел

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

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

3. Math.random() формирует числа похожие на 0.6592126750964376 или 0.4571938784553331. В дальнейшем результат масштабируются до нужного формата и диапазона.

4. Результатом метода может быть ноль, но единица никогда.

5. В сферах связанных с безопасностью рекомендуется использовать Web Cryptography API и его методы getRandomValues() и generateKey() .

Случайное число в диапазоне

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

 function getRandomNumber(min, max)

getRandomNumber(0.1, 0.2)

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

Получаем целое число от минимума (включительно) до максимума (не включительно)

 function getRandomNumber(min, max)
 function getRandomNumber(min, max)

ceil() — округляет в большую сторону, floor() в меньшую.

getRandomNumber(1, 4)

Случайное число в диапазоне включительно max

Функция учитывает недостатки предыдущих решений и выводит случайные числа от и до включительно для обоих случаев.

 function getRandomNumber(min, max)
 function getRandomNumber(min, max)
 function getRandomNumber(min, max)

round() — округляет до ближайшего целого.

getRandomNumber(1, 4)

Итого

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

Skypro — научим с нуля

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *