Контекст

В JavaScript мы можем генерировать случайные числа, используя Math.random(). К сожалению, эта функция генерирует только числа с плавающей точкой от 0 до 1.

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

Наша пользовательская функция random() позволяет использовать именно это!

Примечание: random() включает первый параметр диапазона, но исключает второй. Например, random(1, 3) может дать нам 1 или 2, но никогда не 3. Это было сделано намеренно, чтобы соответствовать поведению Math.random, а также методам типа slice

Применение

// Get a random number between 1 and 100
random(1, 101);
// 5
random(1, 101);
// 36
random(1, 101);
// 100

// Gets a random number between -100 and 99
random(-100, 100);
// 89
random(-100, 100);
// 1
random(-100, 100);
// 99ja

Объяснение

Сначала мы создаем случайное число с плавающей запятой между 0..1, сгенерированное Math.random(). Затем мы применяем максимальное значение, указанное вами, перед его округлением.

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

const max = 5;
// Gets a random value between 0 and 0.999999
const randomFloat = Math.random();
// Multiply it by our max, here 5.
// Gets a float between 0 and 4.999999
const multiplied = randomFloat * max;
// Round it up using Math.floor.
// Get either 0, 1, 2, 3 or 4.
const randomNumber = Math.floor(multiplied);

Теперь вы, вероятно, задаетесь вопросом, как получить минимальное значение, отличное от 0? Или число от 1 до 5?

Хитрость здесь заключается в том, чтобы получить дельту. Здесь 5–1 = 4, поэтому мы получаем случайное значение от 0 до 3,99999. Затем мы можем увеличить его на наше минимальное значение, чтобы поместить его в правильный диапазон:

const min = 1;
const max = 5;
// Calculate the delta
const delta = max - min;
// Get a random float between 0 and 0.999999
const randomFloat = Math.random();
// Multiply it by our delta, 4
// Will be between 0 and 3.999999
const multiplied = randomFloat * delta;
// Round it up using Math.floor
// This will give us 0, 1, 2 or 3.
const roundedMultiplied = Math.floor(multiplied);
// A random number to which we add the min
// We will finally get 1, 2, 3 or 4.
const final = roundedMultiplied + min;

Заключение

Последний фрагмент в компактном выражении:

const random = (min, max) => {
  return Math.floor(Math.random() * (max - min)) + min;
}

Первоначально опубликовано на https://dev.to 11 июня 2023 г.