Есть ли способ создать случайное число в указанном диапазоне (например, от 1 до 6: 1, 2, 3, 4, 5 или 6) в JavaScript?
javascript
random
Миргород
источник
источник
Math.floor((Math.random()*10)+1);
не может работать для вас, как указано здесь, на w3schools.com/jsref/jsref_random.asp ..?Ответы:
Важный
Следующий код работает, только если минимальное значение равно
1
. Это не работает для минимальных значений, кроме1
.Если вы хотите получить случайное целое число от 1 ( и только 1 ) до 6, вы должны вычислить:
Куда:
источник
Math.floor(Math.random() * 6) + 2
означает, что, еслиMath.random()
результаты в 0,99, наше случайное значение будет7
То, что он делает «дополнительно», это то, что он допускает случайные интервалы, которые не начинаются с 1. Таким образом, вы можете получить случайное число от 10 до 15, например. Гибкость.
источник
to
аргумент arg, онfrom
становится максимальнымReturns a floating-point, pseudo-random number in the range [0, 1) that is, from 0 (inclusive) up to but not including 1 (exclusive), which you can then scale to your desired range.
( developer.mozilla.org/en-US/docs/JavaScript/Reference/… )Math.random ()
Возвращает случайное целое число между min ( включенным ) и max ( включенным ):
Или любое случайное число между min ( включено ) и max ( не включено ):
Полезные примеры (целые числа):
** И всегда приятно напоминать (Мозилла):
источник
[1,2]
, есть 25% шансMath.random()
даст вам ряд от одного из них[0,0.49]
,[0.5,0.99]
,[1,1.49]
,[1.5,1.99]
. Округление этих интервалов приведет к 0, 1, 1, 2, что не является четным распределением. Пол их приводит к 0, 0, 1, 1.Math.round
overMath.floor
даст разные результаты.function getRandomInt(min, max) { return Math.round((min - 0.5) + Math.random() * (max - min + 1)); }
Другие решения:
(Math.random() * 6 | 0) + 1
~~(Math.random() * 6) + 1
Попробуй онлайн
источник
~~a
и побитовое ИЛИ (a | 0) - более быстрые способы написания Math.floor (a)a | 0
это также самый быстрый и самый оптимизированный способ преобразования строки в целое число. Работает только со строками, содержащими целые числа ("444"
и"-444"
), то есть без дробей / дробей. Это дает0
для всего, что терпит неудачу. Это одна из основных оптимизаций за asm.js.~~(Math.random() * (50000000000000 - 0 + 1)) + 0
иMath.floor(Math.random() * (50000000000000 - 0 + 1)) + 0
TL; DR
Чтобы получить случайное число
generateRandomInteger(-20, 20);
ОБЪЯСНЕНИЕ НИЖЕ
Нам нужно получить случайное целое число, скажем, X между min и max.
Правильно?
то есть min <= X <= max
Если мы вычтем мин из уравнения, это эквивалентно
0 <= (Х - мин) <= (Макс - мин)
Теперь давайте умножим это на случайное число r, которое
0 <= (X - мин) * r <= (макс - мин) * r
Теперь давайте вернем мин в уравнение
min <= min + (X - min) * r <= min + (max - min) * r
Теперь давайте выберем функцию, которая приводит к r так , что она удовлетворяет диапазону наших уравнений как [min, max]. Это возможно только если 0 <= r <= 1
ХОРОШО. Теперь диапазон r ie [0,1] очень похож на результат функции Math.random (). Не так ли?
Например,
Случай г = 0
min
+ 0 * (max
-min
) = минСлучай г = 1
min
+ 1 * (max
-min
) = максСлучайный случай с использованием Math.random 0 <= r <1
min
+ r * (max
-min
) = X , где X имеет диапазон min <= X < maxПриведенный выше результат X является случайным числом. Однако благодаря Math.random () наша левая граница является включающей, а правая - исключительной. Чтобы включить нашу правую границу, мы увеличиваем правую границу на 1 и получаем результат.
Чтобы получить случайное число
generateRandomInteger(-20, 20)
;источник
Или в Underscore
источник
источник
jsfiddle: https://jsfiddle.net/cyGwf/477/
Случайное целое число : чтобы получить случайное целое число между
min
иmax
, используйте следующий кодСлучайное число с плавающей точкой : чтобы получить случайное число с плавающей точкой между
min
иmax
, используйте следующий кодСсылка: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random
источник
Математика не моя сильная сторона, но я работал над проектом, в котором мне нужно было генерировать много случайных чисел между положительным и отрицательным.
Например
Конечно, вы также можете добавить некоторую проверку, чтобы убедиться, что вы не делаете это с чем-либо, кроме чисел. Также убедитесь, что min всегда меньше или равно max.
источник
min + Math.random() * max
даст вам цифры от мин до мин + макс, а это не то, что вы хотите. Первая ветвьif
является правильной, но ее можно было бы упростить, чтобы сказатьreturn min + Math.random() * (max - min)
, что является правильным решением независимо от того, является ли min положительным или отрицательным (см. Другие ответы). Кроме того, имейте в виду, что вам все еще нужно подвести результат, если вы не хотите дроби.Я написал более гибкую функцию, которая может дать вам случайное число, а не только целое число.
Фиксированная версия.
источник
пример
Вернуть случайное число от 1 до 10:
Результат может быть:
3
Попробуйте сами: здесь
-
или используя lodash / undescore:
_.random(min, max)
Документы: - lodash - undescore
источник
Несмотря на множество ответов и почти одинаковый результат. Я хотел бы добавить свой ответ и объяснить его работу. Потому что важно понимать его работу, а не копировать вставку однострочного кода. Генерация случайных чисел - не что иное, как простая математика.
КОД:
источник
Я искал генератор случайных чисел, написанный на TypeScript, и я написал это после прочтения всех ответов, надеюсь, он будет работать для кодировщиков TypeScript.
источник
Math.random()
быстрый и подходящий для многих целей, но он не подходит, если вам нужны криптографически безопасные значения (это небезопасно) или если вам нужны целые числа из абсолютно равномерного несмещенного распределения (подход умножения, используемый в других ответах, дает определенные значения несколько чаще чем другие).В таких случаях мы можем использовать
crypto.getRandomValues()
для создания безопасных целых чисел и отклонить любые сгенерированные значения, которые мы не можем равномерно отобразить в целевой диапазон. Это будет медленнее, но не должно быть значительным, если вы не генерируете очень большое количество значений.Чтобы прояснить проблему смещения распределения, рассмотрим случай, когда мы хотим сгенерировать значение от 1 до 5, но у нас есть генератор случайных чисел, который выдает значения от 1 до 16 (4-битное значение). Мы хотим иметь одинаковое количество сгенерированных значений, сопоставляемых с каждым выходным значением, но 16 не делится поровну на 5: остается остаток от 1. Поэтому нам нужно отклонить 1 из возможных сгенерированных значений и продолжить только тогда, когда мы получим одно из 15 меньших значений, которые могут быть равномерно отображены в нашем целевом диапазоне. Наше поведение может выглядеть следующим образом:
В следующем коде используется аналогичная логика, но вместо этого генерируется 32-разрядное целое число, поскольку это самый большой общий целочисленный размер, который может быть представлен стандартным
number
типом JavaScript . (Это можно изменить, чтобы использоватьBigInt
s, если вам нужен больший диапазон.) Независимо от выбранного диапазона, доля сгенерированных значений, которые отклоняются, всегда будет меньше 0,5, поэтому ожидаемое количество отклонений всегда будет меньше 1,0 и обычно близко к 0.0; Вам не нужно беспокоиться о том, что это зациклится навсегда.источник
Добавление
float
с фиксированной точностью версии на основеint
версии в ответе @ Francisc:так:
и для int ответа
источник
Крипто-сильное случайное целое число в диапазоне [a, b] (предположение: a <b)
источник
Это должно работать:
источник
Я обнаружил отличный новый способ сделать это, используя параметры по умолчанию ES6. Это очень изящно, поскольку допускает либо один аргумент, либо два аргумента. Вот:
источник
Это примерно на девять лет позже, но randojs.com делает это простым однострочником:
Вам просто нужно добавить это в заголовок вашего HTML-документа, и вы можете делать практически все, что вы хотите, со случайностью. Случайные значения из массивов, случайные элементы jquery, случайные свойства объектов и даже предотвращение повторений при необходимости.
источник
Это работает для меня и выдает такие значения, как стандартная библиотечная функция Python random.randint :
источник
Попробуйте использовать:
источник
вернуть 1-6, как кости в принципе,
источник