Как я могу сгенерировать случайный дубль за 2 интервала, используя java .util Случайный класс? - PullRequest
0 голосов
/ 02 марта 2020

Я хочу иметь возможность генерировать случайный двойной из 2 интервалов, ie интервалы от 0,1 до 5,8 будут генерировать один двойной от 0, 1, 5, 6, 7 и 8.

В идеале это было бы возможно при использовании переменных для интервалов, а не полагаться на известное значение. Я попытался применить logi c для генерации int между несколькими интервалами, но не могу сделать их совместимыми. Любые советы?

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Я не уверен, что это был бы лучший способ сделать это, но вот мой первоначальный подход к этой проблеме:

Нам нужно оценить общий диапазон желаемых границ. В вашем примере нам нужно [0,1] U [5,8]. От 1 - 0 = 1 и 8 - 5 = 3. Общий интервал составляет 1 + 3 = 4.

. Затем я сгенерирую случайное число между началом первого интервала (0) и началом первого интервала + общий интервал (0 + 4 = 4). Итак, случайный дубль между 0 и 4.

Скажем, это 0,5. Это меньше, чем конец нашей первой границы ([0,1]), так что это наше окончательное число.

Теперь допустим, что наше сгенерированное число было 2. Это больше, чем конец нашей первой границы , Нам нужно вычесть окончание первой границы из нашего сгенерированного числа. 2 - 1 = 1. Теперь нам нужно добавить начало второй границы ([5,8]) к этому числу, поэтому 1 + 5 = 6. Итак, 6 - это наше окончательное число.

Вот реализация:

public class RandomIntervals {
    static class Interval {
        double start;
        double end;

        public Interval(double start, double end) {
            this.start = start;
            this.end = end;
        }

        public double getSpan() {
            return end - start;
        }
    }

    public static double nextDouble(double min, double max) {
        return min + (max - min) * new Random().nextDouble();
    }

    public static void main(String[] args) {
        Interval interval1 = new Interval(0, 1);
        Interval interval2 = new Interval(5, 8);

        double totalSpan = interval1.getSpan() + interval2.getSpan();

        double randomNumber = nextDouble(interval1.start, interval1.start + totalSpan);

        if (randomNumber > interval1.end) {
            randomNumber -= interval1.end;
            randomNumber = interval2.start + randomNumber;
        }

        System.out.println(randomNumber);

    }
}
0 голосов
/ 03 марта 2020

Поскольку Math.random в Java генерирует число с приблизительно равномерным распределением, эта проблема по существу генерирует случайное число на одном большем интервале и отображает его на два разных интервала на основе значения. Скажем, первый интервал (a, b), а второй интервал (c, d), где c> b.

Сначала сгенерируйте случайное число между (a, b + d - c) или (0, b + d - c - a).

В первом случае ( a, b + d - c):

Если число меньше b, вернуть число. Это случайное число из интервала (a, b).

Если нет, вернуть число + c - b. Это случайное число из интервала (c, d).

Во втором случае (0, b + d - c - a):

Если число меньше чем b - a, верните a + число.

В противном случае верните c + number + a - b с теми же аргументами, что и в первом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...