我如何使用java.util Random类在2个时间间隔内生成一个随机double?

问题描述 投票:0回答:2

我希望能够从2个间隔中生成一个随机双精度数,即间隔为0,1和5,8会在0、1、5、6、7和8之间生成一个单个双精度数。

理想情况下,使用间隔的变量而不依赖已知值是可能的。我尝试应用在多个间隔之间生成int的逻辑,但无法使两者兼容。有提示吗?

java double intervals java.util.random
2个回答
0
投票

由于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
投票

我不确定这是否是最好的方法,但这是我最初解决此问题的方法:

我们需要评估所需边界的总跨度。在您的示例中,我们需要[0,1] U [5,8]。来自1 - 0 = 18 - 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);

    }
}
© www.soinside.com 2019 - 2024. All rights reserved.