Ключевым утверждением являются следующие:
int number = 1 + (int)(Math.random() * ((12 - 1) + 1));
number = (int) Math.floor(number);
Первое утверждение дает ответ, который вам нужен, но довольно громоздким способом. Давайте рассмотрим, что происходит:
((12 - 1) + 1)
- 12
. (Это оценивается во время компиляции ...)
Math.random()
дает double
в диапазоне 0.0D <= rd < 1.0D
.
Math.random() * 12
дает double
в диапазоне 0.0D <= rd < 12.0D
.
Приведение (int)
преобразует double
в int
, округляя до нуля. Другими словами (int)(Math.random() * 12)
будет целым числом в диапазоне 0 <= ri <= 11
.
Наконец, вы добавляете 1
, давая целое число в диапазоне 1 <= ri <= 12
.
W**5
: -)
Более простая и понятная версия:
private static Random rand = new Random();
...
int number = 1 + rand.nextInt(12);
Второе утверждение - это (насколько я могу судить) пустяк. Он неявно преобразует int
в double
, получает форму double
наибольшего целого числа, которое меньше или равно этому double
, и преобразует его обратно в int
. Результат всегда будет идентичен исходному int
.