Генерировать случайное число между двумя числами в JavaScript

есть ли способ генерировать случайное число в указанном диапазоне (например, от 1 до 6: 1, 2, 3, 4, 5, или 6) в JavaScript?

17 ответов


Если вы хотите получить между 1 и 6, Вы бы рассчитать:

Math.floor(Math.random() * 6) + 1  

где:

  • 1-начальное число
  • 6-количество возможных результатов (1 + start (6) конец (1))

function randomIntFromInterval(min,max) // min and max included
{
    return Math.floor(Math.random()*(max-min+1)+min);
}

что он делает "дополнительно", это позволяет случайные интервалы, которые не начинаются с 1. Так что вы можете получить случайное число от 10 до 15 например. Гибкость.


математика.random ()

С Mozilla документация по сети разработчиков:

// 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;

других решений:

  • (Math.random() * 6 | 0) + 1
  • ~~(Math.random() * 6) + 1

TL; DR

function generateRandomInteger(min, max) {
  return Math.floor(min + Math.random()*(max + 1 - min))
}

чтобы получить случайное число generateRandomInteger(-20, 20);

ОБЪЯСНЕНИЕ НИЖЕ

нам нужно получить случайное целое число, скажем X между min и Max.

верно?

Я.е min

если вычесть min из уравнения, это эквивалентно

0

теперь давайте умножим это на случайное число r которая составляет

0

теперь, давайте добавим обратно мин в уравнение

min

теперь, давайте выбрали функцию, которая приводит к r такой,что он удовлетворяет нашему диапазону уравнений как [min, max]. Это возможно, только если 0

ОК. Теперь диапазон r i.e [0,1] очень похоже на математику.результат функции random (). Не так ли?

Математика.функция random () возвращает псевдослучайную функцию с плавающей запятой число в диапазоне [0, 1); то есть, от 0 (включительно) до но не в том числе 1 (эксклюзив)

например,

случай r = 0

min + 0 * (max-min) = мин

случай r = 1

min + 1 * (max-min)= Макс

случайный случай с использованием математики.случайный 0

min + r * (max-min)= X, где X имеет ряд мин X Макс

выше X - случайное число. Однако из-за математики.random() наша левая граница является инклюзивным, а право-эксклюзивным. Чтобы включить нашу правую границу, мы увеличиваем правую границу на 1 и помещаем результат.

function generateRandomInteger(min, max) {
  return Math.floor(min + Math.random()*(max + 1 - min))
}

чтобы получить случайное число

generateRandomInteger(-20, 20);


var x = 6; // can be any number
var rand = Math.floor(Math.random()*x) + 1;

или подчеркивание

_.random(min, max)

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.


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

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)

документы: - лодашь - undescore


Я искал генератор случайных чисел, написанный в 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 к максимальному числу, а затем вычесть минимальное число для любой из этого, чтобы работать, и мне нужно сделать много случайных целых чисел, эта функция работает.

var random = function(max, min) {
    high++;
    return Math.floor((Math.random()) * (max - min)) + min;
};

это работает как с отрицательными, так и положительными числами, и я работаю над десятичными библиотеки.


вместо 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).

function random(min, max){
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

Я обнаружил, что решение Francisc выше не включало минимальное или максимальное число в результатах, поэтому я изменил его следующим образом:

function randomInt(min,max)
{
    return Math.floor(Math.random()*(max-(min+1))+(min+1));
}