Я думаю, вы можете немного упростить математику.Давайте создадим минимальный множитель и максимальный множитель.
Если minInclusive
меньше (или равно) multiplier
, то мы знаем, что мы можем установить minMultiplier
в 1
.В противном случае он равен следующему кратному multiplier
, который больше minInclusive
, деленному на multiplier
.
maxInclusive
всегда должен быть больше (или равен) multiplier
, поэтомумы можем установить maxMultiplier
в maxInclusive / multiplier
.
Затем мы просто умножим multiplier
на случайное число от minMultiplier
до maxMultiplier
включительно на обоих концах:
public static int getIntegerInRangeMultipleOf(int minInclusive, int maxInclusive, int multiplier) {
int minMultiplier = minInclusive <= multiplier ? 1 : (int) Math.ceil((double) minInclusive / multiplier);
int maxMultiplier = maxInclusive / multiplier;
return multiplier * ThreadLocalRandom.current().nextInt(minMultiplier, maxMultiplier + 1);
}
Я проверил это со многими различными диапазонами положительных чисел, и, кажется, он работает просто отлично.