В javascript часто требуется сгенерировать случайное число. Например, чтобы нарисовать звезду в ночном небе или анимировать хаотические аттракторы. Однако существуют различные способы генерации, и от приложения зависит, какой вы будете использовать.
- Базовая генерация
- Генерация между числами: минимальные и максимальные значения
- Случайное целое число в диапазоне, включая минимальное и максимальное.
- Подбрасывание монеты(случайное true или false)
- Генерация с исключениями
- Генерация случайного, неповторяющегося числа
- Криптография
- Комментарии ( 4 ):
- 2 ответа 2
- На этой странице
- Синтаксис
- Возвращаемое значение
- Примеры
- Получение случайного числа от 0 (включительно) до 1 (не включая)
- Получение случайного числа в заданном интервале
- Получение случайного целого числа в заданном интервале
- Получение случайного целого числа в заданном интервале, включительно
Базовая генерация
Самый простой способ получить случайное число — это метод Math.random(), встроенный в javascript.
Math.random() всегда возвращает число с плавающей точкой между 0 и 1.
Технически, число, которое вы получите, может быть 0, но никогда не будет точно 1.
Посколько это используется достаточно часто, Math.random() помещают внутрь функции
function getRandom() <
return Math.random();
>
Проблема, конечно, заключается в том, что функция всегда будет создавать случайное число в пределах очень ограниченного диапазона. Большинство других рецептов на этой странице предназначены для того, чтобы решить эту проблему.
Генерация между числами: минимальные и максимальные значения
Чтобы добавить эту функциональность, нам потребуется немного математики.
function getRandomFloat(min, max) <
return Math.random() * (max — min) + min;
>
getRandomFloat(11, 101)
> 75.31898734299466
function getRandomInt(min, max) <
return Math.floor(Math.random() * (max — min)) + min;
>
getRandomInt(10, 20)
> 12
Случайное целое число в диапазоне, включая минимальное и максимальное.
function getRandomInRange(min, max) <
return Math.floor(Math.random() * (max — min + 1)) + min;
>
getRandomInRange(1, 10)
> 7
Подбрасывание монеты(случайное true или false)
Если вам нужно получить просто 0 или 1, то используйте следующий код:
function coinToss() <
return Math.floor(Math.random() * 2);
>
coinToss();
> 0
Если нужно конкретно true или false
function coinToss() <
return (Math.floor(Math.random() * 2) === 0);
>
coinToss();
> true
Если вам нужно ассоциировать любые слова со сторонами монеты
function coinFlip() <
return (Math.floor(Math.random() * 2) === 0) ? «up» : «down»;
>
coinToss();
> up
Генерация с исключениями
Для ограниченного диапазона целых чисел: создайте массив чисел, которые вы бы хотели вырисовывать, и выберите из него случайное.
var numPool = [ 1, 3, 5, 7, 9, 10 ],
rand = numPool[Math.floor(Math.random() * numPool.length)];
Для чего-нибудь более динамичного: добавьте массив целых чисел, которые вы хотите исключить, и пустой массив, который будет содержать результат фильтрации первого массива во второй.
var numPool = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];
var excludePool = [ 3, 4 ];
var filteredPool = [];
Затем создайте цикл по массиву numPool, проверьте, есть ли случайное число в массиве исключений excludePool, и поместите результат в массив filteredPool:
Наконец, отобразите случайное число из отфильтрованного массива
var rand = filteredPool[Math.floor(Math.random() * filteredPool.length)];
Генерация случайного, неповторяющегося числа
Для небольших наборов чисел: создайте массив, заполненный элементами, перетасуйте их случайным образом, поместите результат в новый массив, затем достаньте перетасованные элементы один раз:
var numPool = [ 13, 21, 36, 14, 27, 10 ];
function shuffle(numPool) <
for(var j, x, i = numPool.length; i; j = parseInt(Math.random() * i), x = numPool[—i], numPool[i] = numPool[j], numPool[j] = x);
return numPool;
>;
var randomResult = shuffle(numPool);
while( randomResult.length > 0 ) <
console.log( randomResult.pop() );
>
Для более больших наборов чисел: создайте и заполните массив случайными целыми числами, отклоняя любое, которое уже было ранее сгенерировано:
var numReserve = []
while (numReserve.length
В коде выше numReserve заполнен 12 случайными числами между 0 и 1000. Числа затем могут быть получены из массива.
Криптография
Всех показанных выше методов будет недостаточно для создания криптографически защищенных функций. Для этого мы можем использовать Web Cryptography API, создав типизированный массив:
var cryptoStor = new Uint16Array(8);
В этом случае мы создаем массив с 8 различными слотами, каждый из которых может содержать 16-битовое целое число без знака. Другие опции включают Int8Array, Uint8Array, int16Array, Int32Array и Uint32Array.
Теперь заполните массив случайными числами определенного типа
Показаны выбранные значения в консоли:
> [43484, 57947, 46691, 49849, 24272, 11827, 28203, 17423]
Web Cryptography API имеет хорошую поддержку в современных браузерах, хотя в некоторых нужно ставить префиксы.
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: .
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: .
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Она выглядит вот так:
Комментарии ( 4 ):
Здравствуйте! Можно вопрос не по теме статьи?
Конечно, можно! Но задайте его, пожалуйста, в службу поддержки: http://support.myrusakov.ru/
Спасибо! В следующий раз, уже ответили на javascript.ru
Прекрасно! Рады за вас!
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Copyright © 2010-2019 Русаков Михаил Юрьевич. Все права защищены.
Почему в данном коде к результату прибавляется единица?
Этот код выведет число от 1 до 100 включительно, или от 2 до 99?
2 ответа 2
Метод Math.random() возвращает псевдослучайное число с плавающей запятой из диапазона [0, 1), то есть, от 0 (включительно) до 1 (но не включая 1), которое затем можно отмасштабировать до нужного диапазона.
Следовательно при умножении на 100 мы получаем диапазон от 0 до 99 , и при инкременте этого диапазона на 1 получим от 1 до 100 .
Если вы хотите получить диапазон от 2 до 99 , то вам нужны следующие коэффициенты:
Если вы хотите получить диапазон от 0 до 100 , то вам нужен следующий коэффициент:
Тут есть еще один важный момент- какой метод вы используете для округления: Math.floor , Math.round или Math.ceil .
В случае с Math.floor — округление вниз. Округляет аргумент до ближайшего меньшего целого.
В случае с Math.round возвращает ближайшее целое число.
В случае с Math.ceil — округление вверх. Округляет аргумент до ближайшего большего целого.
Резюмируя: лучше использовать Math.floor или Math.ceil как методы округления, т.к. в случае с Math.round мы получаем неравномерную вероятность выпадения для нижней и верхней границы по 0.4(9) против 0.(9) для всех остальных целых чисел диапазона.
Пример: от 0 до 0.4(9) округляется до 0 , от 99.5 до 99.(9) округляется до 100 против скажем от 2.5 до 3.4(9) , которое округлится до 2 .
На этой странице
Метод Math.random() возвращает псевдослучайное число с плавающей запятой из диапазона [0, 1) , то есть, от 0 (включительно) до 1 (но не включая 1), которое затем можно отмасштабировать до нужного диапазона. Реализация сама выбирает начальное зерно для алгоритма генерации случайных чисел; оно не может быть выбрано или сброшено пользователем.
Примечание: метод Math.random() не предоставляет криптографически стойкие случайные числа. Не используйте его ни для чего, связанного с безопасностью. Вместо него используйте Web Crypto API (API криптографии в вебе) и более точный метод window.crypto.getRandomValues() .
Синтаксис
Возвращаемое значение
Псевдослучайное число с плавающей запятой от 0 (включительно) до 1 (не считая).
Примеры
Обратите внимание, что поскольку числа в JavaScript являются числами с плавающей запятой стандарта IEEE 754 с поведением при округлении к ближайшему чётному, все эти диапазоны (исключая диапазон с простым вызовом Math.random() ), не точны. Если заданы очень большие границы (2 53 или выше), возможен крайне редкий случай вычисления обычно исключённой верхней границы.
Получение случайного числа от 0 (включительно) до 1 (не включая)
Получение случайного числа в заданном интервале
Этот пример возвращает случайное число в заданном интервале. Возвращаемое значение не менее (и может быть равно) min и не более (и не равно) max .
Получение случайного целого числа в заданном интервале
Этот пример возвращает случайное целое число в заданном интервале. Возвращаемое значение не менее min (или следующее целое число, которое больше min , если min не целое) и не более (но не равно) max .
Может показаться заманчивым использовать Math.round() для округления, но это может сделать распределение неравномерным, что может оказаться неприемлимым для ваших нужд.
Получение случайного целого числа в заданном интервале, включительно
Функция getRandomInt() выше включает минимальное значение, но не включает максимальное. Но что если вам нужно, чтобы влючалось и минимальное, и максимальное значение? Функция getRandomIntInclusive() решает этот вопрос.