Генерация случайного целого числа в диапазоне, кратном другому целому числу в Java - PullRequest
0 голосов
/ 30 ноября 2018

Я изо всех сил пытаюсь завершить служебный метод, чтобы сгенерировать число в диапазоне 2 целых чисел, которое также является множителем другого целого числа.

Например:

public static void main(String[] args) {
    getIntegerInRangeMultipleOf(100, 1000, 444);
} 

Следуетдоходность либо 444 , либо 888 .Ничего другого.

Я придумал это решение:

public static int getIntegerInRangeMultipleOf(int minInclusive, int maxInclusive, int multiplier) {
    return Math.toIntExact(Math.round((Math.random() * (maxInclusive - minInclusive) + minInclusive) / multiplier) * multiplier);
}

Но для приведенного выше примера иногда оно дает 0 (ноль) в дополнение к 444 и 888 .

Подскажите, пожалуйста, как исправить функцию.

Ответы [ 4 ]

0 голосов
/ 30 ноября 2018

не знаю, как вывести актерский состав (int), но, кажется, работает

public static int getIntegerInRangeMultipleOf(int minInclusive,
                                              int maxInclusive,
                                              int multiplier) {
    double random =
            ((Math.random()*(1d - 0.1) + 0.1) * (maxInclusive - minInclusive) + minInclusive) / multiplier;
    if(random < 1) {
        return multiplier;
    } else {
        return (int) Math.floor(random) * multiplier;
    }
}
0 голосов
/ 30 ноября 2018

Возвращает 0, когда Math.random() возвращает 0.0.Может быть просто найден с помощью следующего теста

public static int getIntegerInRangeMultipleOf(int minInclusive, int maxInclusive, int multiplier) {
        double v =0.0 * (maxInclusive - minInclusive) + minInclusive;
        System.out.println("v = " + v);
        return Math.toIntExact(Math.round(v / multiplier) * multiplier);
    }

@Test
public void test () {
    int t =  getIntegerInRangeMultipleOf(100, 1000, 444);
    System.out.println(t);
}
0 голосов
/ 30 ноября 2018

Если мы добавим условие, чтобы выбрать дополнение к Math.random() * (maxInclusive - minInclusive), мы можем исключить случай 0.

public static int getIntegerInRangeMultipleOf(int minInclusive, int maxInclusive, int multiplier) {
    return Math.toIntExact(Math.round((Math.random() * (maxInclusive - minInclusive) + ( minInclusive < multiplier ? multiplier : minInclusive) ) / multiplier) * multiplier);
}
0 голосов
/ 30 ноября 2018

Я думаю, вы можете немного упростить математику.Давайте создадим минимальный множитель и максимальный множитель.

Если 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);
}

Я проверил это со многими различными диапазонами положительных чисел, и, кажется, он работает просто отлично.

...