@Aucuo

Функция Math.floor?

Пожалуйста, напишите как работает math.floor и вообще вся функция:

function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}

Понятно что она генерирует случайное число, но как это происходит?!
  • Вопрос задан
  • 742 просмотра
Решения вопроса 2
@tomatho
Предполагаю что язык JavaScript, хоть в тегах это не указано.
Рассмотрим пример вызова getRandomInt(5, 10)
Math.random() - случайное число [0, 1)
И важно именно что 1 не включительно!
(max - min + 1) - я бы назвал количеством вариантов = 6.

Почему 6? Что значит это 6? Попробуем посчитать 6 чисел начиная с нуля, получим:
0, 1, 2, 3, 4, 5
Теперь для себя нужно подчеркнуть что это получилось [0, 5] включительно.
То есть, в отрезке [0, 5] ровно 6 целых чисел.
Это распространённое заблуждение новичков, что в таком отрезке 5 чисел.

Теперь смотрим дальше. Вспоминаем что Math.random() возвращает [0, 1).
Умножим как написано в формуле на 6, получим:
[0, 6)
Подчеркнём снова, что 6 не включительно. Запишем 6 как пять и девять в периоде:
[0, 5.(9) )
Мысленно разделим отрезок на диапазоны где Math.floor() (округление вниз) даёт одинаковые результаты:
[0, 0.(9) ), [1, 1.(9) ), [2, 2.(9) ), [3, 3.(9) ), [4, 4.(9) ), [5, 5.(9) ).

Вспомним, что Math.random() возвращает число в отрезке [0, 1) равновероятно,
а это означает, что число в диапазоне [0, 0.(9) ) будет выбрано с той же вероятностью,
что и в диапазоне [1, 1.(9) ) в силу "равности" длины отрезков.
Math.floor() будет отображать числа из этих отрезков на числа:
0, 1, 2, 3, 4, 5
И в силу "равности" длины отрезков, эти числа получатся тоже равновероятно.

Наконец осталось прибавить min как в формуле, получим
0+5, 1+5, 2+5, 3+5, 4+5, 5+5
Или
5, 6, 7, 8, 9, 10

Теперь надеюсь ясна вся подноготная.
И следовательно ясно, что эта функция возвращает равновероятно целое число в отрезке [min, max].

Один важный комментарий: так будет до тех пор, пока min, max - целые числа.
Если это не так, тем не менее не составляет труда понять поведение функция проделав те же ходы выше.
Ответ написан
Комментировать
NeiroNx
@NeiroNx
Программист
getRandomInt(50, 70)
Math.random() - случайное число от 0 до 1
(max - min + 1) - это размер диапазона от 50 до 70 - размер 20
min - минимальное число диапазона - 50
Math.floor() - приводит к целому числу
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы