Генерация случайного числа между двумя числами в 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

Или в 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

Получить случайное целое число от 0 до 400

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

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

возвращает некоторый процент от 6 (макс .: 5, мин: 0) и добавляет 1 . Автору повезло, что нижняя граница была 1. , потому что процентный пол «максимально» вернет 5, что меньше 6 на 1, и эта 1 будет добавлена ​​к нижней границе 1.

Проблемы возникают, когда нижняя граница больше 1. Например, Задача: генерировать случайное число от 2 до 6 .

(по авторской логике) Math.floor(Math.random() * 6) + 2

, очевидно, что если мы получим здесь 5 -> Math.random() * 6 а затем добавьте 2, результат будет 7, что выходит за желаемую границу 6.

Другой пример, Задача: генерировать случайные числа от 10 до 12 .

(по авторской логике) Math.floor(Math.random() * 12) + 10

, (извините за повторение) очевидно, что мы получаем 0%-99% процентов числа «12» , что выйдет далеко за пределы желаемой границы 12.

Итак, правильная логика состоит в том, чтобы взять разницу между нижней и верхней границами, добавить 1 , и только затем перекрыть ее (чтобы вычесть 1, потому что Math.random()

возвращает 0–0,99, поэтому нет возможности получить полную верхнюю границу, поэтому мы добавляем 1 к верхней границе, чтобы получить максимум 99% (верхняя граница + 1), а затем мы уменьшаем ее, чтобы избавиться от лишнего). Как только мы получили нижний процент (разница + 1), мы можем добавить нижнюю границу, чтобы получить желаемое случайное число между двумя числами.

Логическая формула для этого будет: 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).

Пример

Вернуть случайное число от 1 до 10:

Math.floor((Math.random() * 10) + 1);

Результат может быть: 3

Попробуйте сами: здесь

-

или используя lodash / undescore:

_.random(min, max)

Документы: - lodash- undescore

Крипто-сильное случайное целое число в диапазоне [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));

Другие вопросы по тегам