Предполагаю что язык 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 - целые числа.
Если это не так, тем не менее не составляет труда понять поведение функция проделав те же ходы выше.