Случайное число от 1 до 100

270
11 октября 2018, 03:40

Почему в данном коде к результату прибавляется единица?

console.log(Math.floor(Math.random() * 100) + 1);

Этот код выведет число от 1 до 100 включительно, или от 2 до 99?

Answer 1

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

Следовательно при умножении на 100 мы получаем диапазон от 0 до 99, и при инкременте этого диапазона на 1 получим от 1 до 100.

Если вы хотите получить диапазон от 2 до 99, то вам нужны следующие коэффициенты:

Math.floor(Math.random() * 98) + 2

Если вы хотите получить диапазон от 0 до 100, то вам нужен следующий коэффициент:

Math.floor(Math.random() * 101)

Тут есть еще один важный момент- какой метод вы используете для округления: Math.floor, Math.round или Math.ceil.

В случае с Math.floor- округление вниз. Округляет аргумент до ближайшего меньшего целого.

Math.floor(1.9) = 1

В случае с Math.round возвращает ближайшее целое число.

Math.round(1.5) = 2
Math.round(1.4) = 1

В случае с Math.ceil - округление вверх. Округляет аргумент до ближайшего большего целого.

Math.ceil(1.1) = 2

Следовательно:

Math.floor(Math.random()*100) - диапазон от 0 до 99
Math.round(Math.random()*100) - диапазон от 0 до 100
Math.ceil(Math.random()*100) - диапазон от 1 до 100

Резюмируя: лучше использовать Math.floor или Math.ceil как методы округления, т.к. в случае с Math.round мы получаем неравномерную вероятность выпадения для нижней и верхней границы по 0.4(9) против 0.(9) для всех остальных целых чисел диапазона.

Пример: от 0 до 0.4(9) округляется до 0, от 99.5 до 99.(9) округляется до 100 против скажем от 2.5 до 3.4(9), которое округлится до 2.

Ссылки: 1, 2, 3.

Answer 2

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random

... returns a floating-point, pseudo-random number in the range 0–1 (inclusive of 0, but not 1)

... возвращает псевдо-случайное число с плавающей точкой в диапазоне 0-1 (включая ноль, но не включая один)