我希望能够从2个间隔中生成一个随机双精度数,即间隔为0,1和5,8会在0、1、5、6、7和8之间生成一个单个双精度数。
理想情况下,使用间隔的变量而不依赖已知值是可能的。我尝试应用在多个间隔之间生成int的逻辑,但无法使两者兼容。有提示吗?
由于Java中的Math.random生成具有近似均匀分布的数字,所以这个问题实质上是在一个较大的间隔上生成随机数,然后根据该值将其映射到两个不同的间隔。假设第一个间隔是(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,则返回一个+号。
否则,返回c +数字+ a-b,其推理与第一种情况相同。
我不确定这是否是最好的方法,但这是我最初解决此问题的方法:
我们需要评估所需边界的总跨度。在您的示例中,我们需要[0,1] U [5,8]。来自1 - 0 = 1
和8 - 5 = 3
。总跨度为1 + 3 = 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(0, totalSpan);
if (randomNumber > interval1.end) {
randomNumber -= interval1.end;
randomNumber = interval2.start + randomNumber;
}
System.out.println(randomNumber);
}
}