Генерация случайного числа между двумя числами в JavaScript
Есть ли способ генерировать случайное число в указанном диапазоне (например, от 1 до 6: 1, 2, 3, 4, 5 или 6) в JavaScript?
39 ответов
Если вы хотите получить от 1 до 6, вы должны рассчитать:
Math.floor(Math.random() * 6) + 1
Куда:
- 1 - начальный номер
- 6 - количество возможных результатов (1 + начало (6) - конец (1))
function randomIntFromInterval(min,max) // min and max included
{
return Math.floor(Math.random()*(max-min+1)+min);
}
То, что он делает "дополнительно", это то, что он допускает случайные интервалы, которые не начинаются с 1. Таким образом, вы можете получить случайное число от 10 до 15, например. Гибкость.
Math.random()
Из документации Mozilla Developer Network:
// Returns a random integer between min (include) and max (include)
Math.floor(Math.random() * (max - min + 1)) + 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;
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 <= (X - min) <= (max - min)
Теперь давайте умножим это на случайное число r, которое
0 <= (X - мин) * r <= (макс - мин) * r
Теперь давайте вернем мин в уравнение
min <= min + (X - min) * r <= min + (max - min) * r
Теперь давайте выберем функцию, которая приводит к r так, что она удовлетворяет диапазону наших уравнений как [min,max]. Это возможно только если 0<= r <=1
ХОРОШО. Теперь диапазон r т.е. [0,1] очень похож на результат функции Math.random(). Не так ли?
Функция Math.random() возвращает псевдослучайное число с плавающей точкой в диапазоне [0, 1); то есть от 0 (включительно) до, но не включая 1 (исключая)
Например,
Случай г = 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 и получаем результат.
function generateRandomInteger(min, max) {
return Math.floor(min + Math.random()*(max + 1 - min))
}
Чтобы получить случайное число
generateRandomInteger(-20, 20)
;
Другие решения:
(Math.random() * 6 | 0) + 1
~~(Math.random() * 6) + 1
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.
Версия функций ES6 / Arrow на основе кода Фрэнсиса (т.е. верхнего ответа):
const randomIntFromInterval = (min, max) => Math.floor(Math.random() * (max - min + 1) + 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
Фиксированная версия.
Это поддерживает отрицательные целые числа:
Math.floor(Math.random() * (max - min + 1)) + min;
Простой однострочник:
Math.floor( Math.random() * MAX_NUMBER ) + MIN_NUMBER
Например:
Math.floor( Math.random() * 6 ) + 1
Решение с наивысшим рейтингом не является математически правильным, как и комментарии под ним ->.
Задача: сгенерировать случайное число от 1 до 6.
возвращает число с плавающей запятой от 0 до 1 (например, 0,344717274374 или 0,99341293123), которое мы будем использовать в процентах, поэтому
Math.floor(Math.random() * 6) + 1
Проблемы возникают, когда нижняя граница больше 1. Например, Задача: генерировать случайное число от 2 до 6 .
(по авторской логике)
Math.floor(Math.random() * 6) + 2
Math.random() * 6
а затем добавьте 2, результат будет 7, что выходит за желаемую границу 6.
Другой пример, Задача: генерировать случайные числа от 10 до 12 .
(по авторской логике)
Math.floor(Math.random() * 12) + 10
, (извините за повторение) очевидно, что мы получаем 0%-99% процентов числа «12» , что выйдет далеко за пределы желаемой границы 12.
Итак, правильная логика состоит в том, чтобы взять разницу между нижней и верхней границами, добавить 1 , и только затем перекрыть ее (чтобы вычесть 1, потому что
Math.random()
Логическая формула для этого будет:
Math.floor(Math.random() * ((up_boundary - low_boundary) + 1)) + 10
Ps: Даже комментарии под самым рейтинговым ответом были неверными, так как люди забыли добавить 1 к разнице , что означает, что они никогда не получат верхнюю границу (да, это может быть случай, если они вообще не хотят получать ее, но требовалось включить верхнюю границу).
Вместо Math.random()
, ты можешь использовать crypto.getRandomValues()
генерировать равномерно распределенные криптографически защищенные случайные числа. Вот пример:
function randInt(min, max) {
var MAX_UINT32 = 0xFFFFFFFF;
var range = max - min;
if (!(range <= MAX_UINT32)) {
throw new Error(
"Range of " + range + " covering " + min + " to " + max + " is > " +
MAX_UINT32 + ".");
} else if (min === max) {
return min;
} else if (!(max > min)) {
throw new Error("max (" + max + ") must be >= min (" + min + ").");
}
// We need to cut off values greater than this to avoid bias in distribution
// over the range.
var maxUnbiased = MAX_UINT32 - ((MAX_UINT32 + 1) % (range + 1));
var rand;
do {
rand = crypto.getRandomValues(new Uint32Array(1))[0];
} while (rand > maxUnbiased);
var offset = rand % (range + 1);
return min + offset;
}
console.log(randInt(-8, 8)); // -2
console.log(randInt(0, 0)); // 0
console.log(randInt(0, 0xFFFFFFFF)); // 944450079
console.log(randInt(-1, 0xFFFFFFFF));
// Uncaught Error: Range of 4294967296 covering -1 to 4294967295 is > 4294967295.
console.log(new Array(24).fill().map(n => randInt(8, 12)));
// [11, 8, 8, 11, 10, 8, 8, 12, 12, 12, 9, 9,
// 11, 8, 11, 8, 8, 8, 11, 9, 10, 12, 9, 11]
console.log(randInt(10, 8));
// Uncaught Error: max (8) must be >= min (10).
Крипто-сильное случайное целое число в диапазоне [a,b] (предположение: a
let rand= (a,b)=> a+(b-a+1)*crypto.getRandomValues(new Uint32Array(1))[0]/2**32|0
console.log( rand(1,6) );
Я искал генератор случайных чисел, написанный на TypeScript, и я написал это после прочтения всех ответов, надеюсь, он будет работать для кодировщиков TypeScript.
Rand(min: number, max: number): number {
return (Math.random() * (max - min + 1) | 0) + min;
}
Несмотря на множество ответов и почти одинаковый результат. Я хотел бы добавить свой ответ и объяснить его работу. Потому что важно понимать его работу, а не копировать вставку однострочного кода. Генерация случайных чисел - не что иное, как простая математика.
КОД:
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));
}
Чтобы вернуть 1-6 как игральные кости,
return Math.round(Math.random() * 5 + 1);
Эта простая функция удобна и работает в ЛЮБЫХ случаях (полностью протестирована). Кроме того, распределение результатов было полностью протестировано и на 100% верно.
function randomInteger(pMin = 1, pMax = 1_000_000_000)
//Author: Axel Gauffre.
//Here: https://stackoverflow.com/a/74636954/5171000
//Inspired by: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random#getting_a_random_number_between_two_values
//
//This function RETURNS A RANDOM INTEGER between pMin (INCLUDED) and pMax (INCLUDED).
// - pMin and pMax should be integers.
// - HOWEVER, if pMin and/or pMax are FLOATS, they will be ROUNDED to the NEAREST integer.
// - NEGATIVE values ARE supported.
// - The ORDER of the 2 arguments has NO consequence: If pMin > pMax, then pMin and pMax will simply be SWAPPED.
// - If pMin is omitted, it will DEFAULT TO 1.
// - If pMax is omitted, it will DEFAULT TO 1 BILLION.
//
//This function works in ANY cases (fully tested).
//Also, the distribution of the results has been fully tested and is 100% correct.
{
pMin = Math.round(pMin);
pMax = Math.round(pMax);
if (pMax < pMin) { let t = pMin; pMin = pMax; pMax = t;}
return Math.floor(Math.random() * (pMax+1 - pMin) + pMin);
}
Работает между любыми двумя числами
const max = 6, min = 1;
Math.floor(Math.random() * (max - 1)) + min;
Краткий ответ: это достижимо с помощью простого массива.
вы можете чередовать элементы массива .
Это решение работает, даже если ваши значения не являются последовательными . Ценностиdon't even have to be a number.
let array = [1, 2, 3, 4, 5, 6];
const randomValue = array[Math.floor(Math.random() * array.length)];
Использование случайной функции, которую можно использовать повторно.
function randomNum(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
randomNum(1, 6);
Добавление 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
Если начальное число равно 1, как в вашем примере (1-6), вы можете использовать метод Math.ceil() вместо Math.floor().
Math.ceil(Math.random() * 6)
вместо
Math.floor(Math.random() * 6) + 1
Не будем забывать и о других полезных математических методах.
Это должно работать:
const getRandomNum = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min
Это примерно на девять лет позже, но https://randojs.com/ делает это простым однострочником:
rando(1, 6)
Вам просто нужно добавить это в заголовок вашего html-документа, и вы можете легко делать практически все, что хотите, со случайностью. Случайные значения из массивов, случайные элементы jquery, случайные свойства из объектов и даже предотвращение повторений при необходимости.
<script src="https://randojs.com/1.0.0.js"></script>
Попробуйте использовать:
function random(min, max) {
return Math.round((Math.random() *( Math.abs(max - min))) + min);
}
console.log(random(1, 6));