Есть ли способ создать случайное число в указанном диапазоне (например, от 1 до 6: 1, 2, 3, 4, 5 или 6) в JavaScript?
Math.floor((Math.random()*10)+1);
не может работать для вас, как указано здесь, на w3schools.com/jsref/jsref_random.asp ..?
Есть ли способ создать случайное число в указанном диапазоне (например, от 1 до 6: 1, 2, 3, 4, 5 или 6) в JavaScript?
Math.floor((Math.random()*10)+1);
не может работать для вас, как указано здесь, на w3schools.com/jsref/jsref_random.asp ..?
Ответы:
Следующий код работает, только если минимальное значение равно 1
. Это не работает для минимальных значений, кроме 1
.
Если вы хотите получить случайное целое число от 1 ( и только 1 ) до 6, вы должны вычислить:
Math.floor(Math.random() * 6) + 1
Куда:
Math.floor(Math.random() * 6) + 2
означает, что, если Math.random()
результаты в 0,99, наше случайное значение будет7
function randomIntFromInterval(min, max) { // min and max included
return Math.floor(Math.random() * (max - min + 1) + min);
}
То, что он делает «дополнительно», это то, что он допускает случайные интервалы, которые не начинаются с 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/… )
Возвращает случайное целое число между min ( включенным ) и max ( включенным ):
function randomInteger(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
Или любое случайное число между min ( включено ) и max ( не включено ):
function randomNumber(min, max) {
return Math.random() * (max - min) + min;
}
Полезные примеры (целые числа):
// 0 -> 10
Math.floor(Math.random() * 11);
// 1 -> 10
Math.floor(Math.random() * 10) + 1;
// 5 -> 20
Math.floor(Math.random() * 16) + 5;
// -10 -> (-2)
Math.floor(Math.random() * 9) - 10;
** И всегда приятно напоминать (Мозилла):
Math.random () не предоставляет криптографически безопасных случайных чисел. Не используйте их для чего-либо, связанного с безопасностью. Вместо этого используйте API Web Crypto, а точнее метод window.crypto.getRandomValues ().
[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
over Math.floor
даст разные результаты.
function getRandomInt(min, max) { return Math.round((min - 0.5) + Math.random() * (max - min + 1)); }
a | 0
это также самый быстрый и самый оптимизированный способ преобразования строки в целое число. Работает только со строками, содержащими целые числа ( "444"
и "-444"
), то есть без дробей / дробей. Это дает 0
для всего, что терпит неудачу. Это одна из основных оптимизаций за asm.js.
~~(Math.random() * (50000000000000 - 0 + 1)) + 0
иMath.floor(Math.random() * (50000000000000 - 0 + 1)) + 0
TL; DR
function generateRandomInteger(min, max) {
return Math.floor(min + Math.random()*(max + 1 - min))
}
Чтобы получить случайное число
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 (). Не так ли?
Функция Math.random () возвращает псевдослучайное число с плавающей точкой в диапазоне [0, 1); то есть от 0 (включительно) до, но не включая 1 (исключая)
Например,
min
+ 0 * ( max
- min
) = мин
min
+ 1 * ( max
- min
) = макс
min
+ r * ( max
- min
) = X , где X имеет диапазон min <= X < max
Приведенный выше результат X является случайным числом. Однако благодаря Math.random () наша левая граница является включающей, а правая - исключительной. Чтобы включить нашу правую границу, мы увеличиваем правую границу на 1 и получаем результат.
function generateRandomInteger(min, max) {
return Math.floor(min + Math.random()*(max + 1 - min))
}
generateRandomInteger(-20, 20)
;
Или в Underscore
_.random(min, max)
var x = 6; // can be any number
var rand = Math.floor(Math.random()*x) + 1;
jsfiddle: https://jsfiddle.net/cyGwf/477/
Случайное целое число : чтобы получить случайное целое число между min
и max
, используйте следующий код
function getRandomInteger(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min)) + min;
}
Случайное число с плавающей точкой : чтобы получить случайное число с плавающей точкой между min
и max
, используйте следующий код
function getRandomFloat(min, max) {
return Math.random() * (max - min) + min;
}
Ссылка: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random
Математика не моя сильная сторона, но я работал над проектом, в котором мне нужно было генерировать много случайных чисел между положительным и отрицательным.
function randomBetween(min, max) {
if (min < 0) {
return min + Math.random() * (Math.abs(min)+max);
}else {
return min + Math.random() * max;
}
}
Например
randomBetween(-10,15)//or..
randomBetween(10,20)//or...
randomBetween(-200,-100)
Конечно, вы также можете добавить некоторую проверку, чтобы убедиться, что вы не делаете это с чем-либо, кроме чисел. Также убедитесь, что min всегда меньше или равно max.
min + Math.random() * max
даст вам цифры от мин до мин + макс, а это не то, что вы хотите. Первая ветвь if
является правильной, но ее можно было бы упростить, чтобы сказать return min + Math.random() * (max - min)
, что является правильным решением независимо от того, является ли min положительным или отрицательным (см. Другие ответы). Кроме того, имейте в виду, что вам все еще нужно подвести результат, если вы не хотите дроби.
Я написал более гибкую функцию, которая может дать вам случайное число, а не только целое число.
function rand(min,max,interval)
{
if (typeof(interval)==='undefined') interval = 1;
var r = Math.floor(Math.random()*(max-min+interval)/interval);
return r*interval+min;
}
var a = rand(0,10); //can be 0, 1, 2 (...) 9, 10
var b = rand(4,6,0.1); //can be 4.0, 4.1, 4.2 (...) 5.9, 6.0
Фиксированная версия.
пример
Вернуть случайное число от 1 до 10:
Math.floor((Math.random() * 10) + 1);
Результат может быть:
3
Попробуйте сами: здесь
-
или используя lodash / undescore:
_.random(min, max)
Несмотря на множество ответов и почти одинаковый результат. Я хотел бы добавить свой ответ и объяснить его работу. Потому что важно понимать его работу, а не копировать вставку однострочного кода. Генерация случайных чисел - не что иное, как простая математика.
КОД:
function getR(lower, upper) {
var percent = (Math.random() * 100);
// this will return number between 0-99 because Math.random returns decimal number from 0-0.9929292 something like that
//now you have a percentage, use it find out the number between your INTERVAL :upper-lower
var num = ((percent * (upper - lower) / 100));
//num will now have a number that falls in your INTERVAL simple maths
num += lower;
//add lower to make it fall in your INTERVAL
//but num is still in decimal
//use Math.floor>downward to its nearest integer you won't get upper value ever
//use Math.ceil>upward to its nearest integer upper value is possible
//Math.round>to its nearest integer 2.4>2 2.5>3 both lower and upper value possible
console.log(Math.floor(num), Math.ceil(num), Math.round(num));
}
Math.random()
быстрый и подходящий для многих целей, но он не подходит, если вам нужны криптографически безопасные значения (это небезопасно) или если вам нужны целые числа из абсолютно равномерного несмещенного распределения (подход умножения, используемый в других ответах, дает определенные значения несколько чаще чем другие).
В таких случаях мы можем использовать crypto.getRandomValues()
для создания безопасных целых чисел и отклонить любые сгенерированные значения, которые мы не можем равномерно отобразить в целевой диапазон. Это будет медленнее, но не должно быть значительным, если вы не генерируете очень большое количество значений.
Чтобы прояснить проблему смещения распределения, рассмотрим случай, когда мы хотим сгенерировать значение от 1 до 5, но у нас есть генератор случайных чисел, который выдает значения от 1 до 16 (4-битное значение). Мы хотим иметь одинаковое количество сгенерированных значений, сопоставляемых с каждым выходным значением, но 16 не делится поровну на 5: остается остаток от 1. Поэтому нам нужно отклонить 1 из возможных сгенерированных значений и продолжить только тогда, когда мы получим одно из 15 меньших значений, которые могут быть равномерно отображены в нашем целевом диапазоне. Наше поведение может выглядеть следующим образом:
Generate a 4-bit integer in the range 1-16.
If we generated 1, 6, or 11 then output 1.
If we generated 2, 7, or 12 then output 2.
If we generated 3, 8, or 13 then output 3.
If we generated 4, 9, or 14 then output 4.
If we generated 5, 10, or 15 then output 5.
If we generated 16 then reject it and try again.
В следующем коде используется аналогичная логика, но вместо этого генерируется 32-разрядное целое число, поскольку это самый большой общий целочисленный размер, который может быть представлен стандартным number
типом JavaScript . (Это можно изменить, чтобы использовать BigInt
s, если вам нужен больший диапазон.) Независимо от выбранного диапазона, доля сгенерированных значений, которые отклоняются, всегда будет меньше 0,5, поэтому ожидаемое количество отклонений всегда будет меньше 1,0 и обычно близко к 0.0; Вам не нужно беспокоиться о том, что это зациклится навсегда.
const randomInteger = (min, max) => {
const range = max - min;
const maxGeneratedValue = 0xFFFFFFFF;
const possibleResultValues = range + 1;
const possibleGeneratedValues = maxGeneratedValue + 1;
const remainder = possibleGeneratedValues % possibleResultValues;
const maxUnbiased = maxGeneratedValue - remainder;
if (!Number.isInteger(min) || !Number.isInteger(max) ||
max > Number.MAX_SAFE_INTEGER || min < Number.MIN_SAFE_INTEGER) {
throw new Error('Arguments must be safe integers.');
} else if (range > maxGeneratedValue) {
throw new Error(`Range of ${range} (from ${min} to ${max}) > ${maxGeneratedValue}.`);
} else if (max < min) {
throw new Error(`max (${max}) must be >= min (${min}).`);
} else if (min === max) {
return min;
}
let generated;
do {
generated = crypto.getRandomValues(new Uint32Array(1))[0];
} while (generated > maxUnbiased);
return min + (generated % possibleResultValues);
};
console.log(randomInteger(-8, 8)); // -2
console.log(randomInteger(0, 0)); // 0
console.log(randomInteger(0, 0xFFFFFFFF)); // 944450079
console.log(randomInteger(-1, 0xFFFFFFFF));
// Error: Range of 4294967296 covering -1 to 4294967295 is > 4294967295.
console.log(new Array(12).fill().map(n => randomInteger(8, 12)));
// [11, 8, 8, 11, 10, 8, 8, 12, 12, 12, 9, 9]
Добавление float
с фиксированной точностью версии на основе int
версии в ответе @ Francisc:
function randomFloatFromInterval (min, max, fractionDigits) {
const fractionMultiplier = Math.pow(10, fractionDigits)
return Math.round(
(Math.random() * (max - min) + min) * fractionMultiplier,
) / fractionMultiplier
}
так:
randomFloatFromInterval(1,3,4) // => 2.2679, 1.509, 1.8863, 2.9741, ...
и для int ответа
randomFloatFromInterval(1,3,0) // => 1, 2, 3
Крипто-сильное случайное целое число в диапазоне [a, b] (предположение: a <b)
let rand= (a,b)=> a+(b-a+1)*crypto.getRandomValues(new Uint32Array(1))[0]/2**32|0
console.log( rand(1,6) );
Это примерно на девять лет позже, но randojs.com делает это простым однострочником:
rando(1, 6)
Вам просто нужно добавить это в заголовок вашего HTML-документа, и вы можете делать практически все, что вы хотите, со случайностью. Случайные значения из массивов, случайные элементы jquery, случайные свойства объектов и даже предотвращение повторений при необходимости.
<script src="https://randojs.com/1.0.0.js"></script>
Это работает для меня и выдает такие значения, как стандартная библиотечная функция Python random.randint :
function randint(min, max) {
return Math.round((Math.random() * Math.abs(max - min)) + min);
}
console.log("Random integer: " + randint(-5, 5));
Попробуйте использовать:
function random(min, max) {
return Math.round((Math.random() *( Math.abs(max - min))) + min);
}
console.log(random(1, 6));