Обратите внимание, что этот подход более предвзятый и менее эффективный, чем подход nextInt
, https://stackoverflow.com/a/738651/360211
Один стандартный шаблон для достижения этой цели:
Min + (int)(Math.random() * ((Max - Min) + 1))
Библиотечная функция Java Math Math.random () генерирует двойное значение в диапазоне [0,1)
. Обратите внимание, что этот диапазон не включает 1.
Чтобы сначала получить определенный диапазон значений, необходимо умножить его на величину диапазона значений, который вы хотите охватить.
Math.random() * ( Max - Min )
Возвращает значение в диапазоне [0,Max-Min)
, где «Max-Min» не включено.
Например, если вы хотите [5,10)
, вам нужно охватить пять целочисленных значений, чтобы вы использовали
Math.random() * 5
Возвращает значение в диапазоне [0,5)
, где 5 не включено.
Теперь вам нужно сместить этот диапазон до диапазона, на который вы нацеливаетесь. Вы делаете это, добавляя значение Min.
Min + (Math.random() * (Max - Min))
Теперь вы получите значение в диапазоне [Min,Max)
. Следуя нашему примеру, это означает [5,10)
:
5 + (Math.random() * (10 - 5))
Но это по-прежнему не включает Max
, и вы получаете двойное значение. Чтобы получить включенное значение Max
, вам нужно добавить 1 к параметру диапазона (Max - Min)
и затем усечь десятичную часть, приведя к int. Это достигается с помощью:
Min + (int)(Math.random() * ((Max - Min) + 1))
И вот оно у вас. Случайное целочисленное значение в диапазоне [Min,Max]
или по примеру [5,10]
:
5 + (int)(Math.random() * ((10 - 5) + 1))