Я не уверен, что это был бы лучший способ сделать это, но вот мой первоначальный подход к этой проблеме:
Нам нужно оценить общий диапазон желаемых границ. В вашем примере нам нужно [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);
}
}