Случайное целое число от min до max
Напишите функцию randomInteger(min, max)
, которая генерирует случайное целое (integer) число от min
до max
(включительно).
Любое число из интервала min..max
должно появляться с одинаковой вероятностью.
Пример работы функции:
alert( randomInteger(1, 5) ); // 1
alert( randomInteger(1, 5) ); // 3
alert( randomInteger(1, 5) ); // 5
Можно использовать решение из предыдущей задачи.
Простое, но неправильное решение
Самое простое, но неправильное решение – генерировать случайное число от min
до max
и округлять его:
function randomInteger(min, max) {
let rand = min + Math.random() * (max - min);
return Math.round(rand);
}
alert( randomInteger(1, 3) );
Функция будет работать, но неправильно. Вероятность получить min
и max
значения в 2 раза меньше, чем любое другое число.
Если вы запустите приведённый выше пример, то заметите, что 2
появляется чаще всего.
Это происходит потому, что метод Math.round()
получает случайные числа из интервала 1..3
и округляет их следующим образом:
число от 1 ... до 1.4999999999 округлится до 1
число от 1.5 ... до 2.4999999999 округлится до 2
число от 2.5 ... до 2.9999999999 округлится до 3
Теперь становится понятно, что 1
получает в 2 раза меньше значений, чем 2
. То же самое с 3
.
Правильное решение задачи
Есть много правильных решений этой задачи. Одно из них – использовать Math.floor
для получения случайного числа от min
до max+1
:
function randomInteger(min, max) {
// случайное число от min до (max+1)
let rand = min + Math.random() * (max + 1 - min);
return Math.floor(rand);
}
alert( randomInteger(1, 3) );
Теперь все интервалы отображаются следующим образом:
число от 1 ... до 1.9999999999 округлится до 1
число от 2 ... до 2.9999999999 округлится до 2
число от 3 ... до 3.9999999999 округлится до 3
Все интервалы имеют одинаковую длину, что выравнивает вероятность получения случайных чисел.