25

Генерация случайных целых чисел в JavaScript в заданном диапазоне

16

Как я могу сгенерировать случайные целые числа между двумя заданными переменными в JavaScript? Например, если я задам x = 4 и y = 8, то мне нужно, чтобы выводилось любое из значений 4, 5, 6, 7, 8.

4 ответ(ов)

6

Этот код генерирует случайное целое число в диапазоне от minimum до maximum, включая оба краевых значения. Вот объяснение того, как он работает:

  1. Math.random() генерирует случайное число с плавающей запятой от 0 (включительно) до 1 (исключительно).
  2. Умножая это число на (maximum - minimum + 1), мы расширяем диапазон до (maximum - minimum + 1), чтобы получилось нужное количество возможных целых чисел.
  3. После этого мы применяем Math.floor(), чтобы округлить результат до ближайшего меньшего целого числа.
  4. Наконец, добавляем minimum, чтобы сдвинуть диапазон от 0 до maximum - minimum в нужный диапазон от minimum до maximum.

Таким образом, итоговая строка кода создает случайное целое число в заданном диапазоне.

Если у вас есть дополнительные вопросы или нужна помощь, не стесняйтесь спрашивать!

0

Если вам нужна переменная в диапазоне от 0 до max, вы можете использовать следующий код:

Math.floor(Math.random() * max);

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

0

Предыдущие ответы не учитывают вполне разумные параметры 0 и 1. Вместо использования ceil или floor вам следует использовать round:

function randomNumber(minimum, maximum){
    return Math.round( Math.random() * (maximum - minimum) + minimum);
}

console.log(randomNumber(0,1));  // 0 1 1 0 1 0
console.log(randomNumber(5,6));   // 5 6 6 5 5 6
console.log(randomNumber(3,-1));  // 1 3 1 -1 -1 -1

Таким образом, функция генерирует случайные числа в указанном диапазоне, и round позволяет корректно возвращать целые числа даже при параметрах, равных 0 и 1.

0

Вопрос: Как работает функция getRandomizer для генерации случайных чисел в заданном диапазоне?

Ответ:

Функция getRandomizer выглядит следующим образом:

function getRandomizer(bottom, top) {
    return function() {
        return Math.floor(Math.random() * (1 + top - bottom)) + bottom;
    }
}

Применение:

var rollDie = getRandomizer(1, 6);

var results = "";
for (var i = 0; i < 1000; i++) {
    results += rollDie() + " "; // Создаем строку, заполненную 1000 случайными числами в диапазоне от 1 до 6.
}

Разбор:

В этом коде мы возвращаем функцию (заимствование из функционального программирования), которая при вызове будет возвращать случайное целое число между значениями bottom и top, включая их. Мы говорим "включая", потому что хотим учитывать как bottom, так и top в диапазоне возможных чисел. Таким образом, вызов getRandomizer(1, 6) может вернуть одно из чисел: 1, 2, 3, 4, 5 или 6.

(bottom — это нижнее значение, а top — верхнее значение)

Math.random() * (1 + top - bottom)

Math.random() возвращает случайное значение с плавающей запятой в диапазоне от 0 до 1. Если мы умножим его на разницу между top и bottom, увеличенную на 1, то получим число в диапазоне от 0 до 1 + top - bottom.

Math.floor(Math.random() * (1 + top - bottom))

Math.floor округляет число вниз до ближайшего целого. Таким образом, мы получаем все целые числа в диапазоне от 0 до top - bottom. Число 1 может показаться лишним, но оно необходимо, потому что при округлении вниз верхнее значение никогда не будет достигнуто. Случайное десятичное число должно находиться в диапазоне 0 до (1 + top - bottom), чтобы после округления мы получили целое число в диапазоне от 0 до top - bottom:

Math.floor(Math.random() * (1 + top - bottom)) + bottom

Код в предыдущем примере дает нам целое число в диапазоне от 0 до top - bottom, так что теперь нам нужно просто добавить bottom к этому результату, чтобы получить целое число в диапазоне от bottom до top, включая оба значения. 😄


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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь