获取包含最大值的随机双精度(Java-ThreadLocalRandom)

获取包含最大值的随机双精度(Java-ThreadLocalRandom),java,random,double,Java,Random,Double,我有一个方法来获得一个最小值和最大值之间的随机双精度。我的问题是,如果值是例如0D和10D,我永远不会得到10D作为可能的结果,因为nextDouble第二个参数是独占的 public static Double randomDouble(Double min, Double max) { return ThreadLocalRandom.current().nextDouble(min, max); } 如果我把这条线放在我的方法中,我会得到一个10D的结果,但我不知道这是否是一个好

我有一个方法来获得一个最小值和最大值之间的随机双精度。我的问题是,如果值是例如0D和10D,我永远不会得到10D作为可能的结果,因为nextDouble第二个参数是独占的

public static Double randomDouble(Double min, Double max) {
    return ThreadLocalRandom.current().nextDouble(min, max);
}
如果我把这条线放在我的方法中,我会得到一个10D的结果,但我不知道这是否是一个好的实践

public static Double randomDouble(Double min, Double max) {

    max = max + 0.000000000000001D;

    return ThreadLocalRandom.current().nextDouble(min, max);
}

这个问题还有别的解决办法吗

我想你可以这样做:

if (ThreadLocalRandom.current().nextDouble() < 0.5) {
    return ThreadLocalRandom.current().nextDouble(min, max);
}
return max - ThreadLocalRandom.current().nextDouble(0, max - min);

概率仍然是不均匀的,但事实上,除了min之外,max的概率与min的概率是一样的。min的概率稍大一些(但实际上只是非常小,甚至不能与以前相比)。

我想你可以这样做:

if (ThreadLocalRandom.current().nextDouble() < 0.5) {
    return ThreadLocalRandom.current().nextDouble(min, max);
}
return max - ThreadLocalRandom.current().nextDouble(0, max - min);

概率仍然是不均匀的,但事实上,除了min之外,max的概率与min的概率是一样的。min的概率稍大一些(但实际上只是非常小,甚至不能与以前相比)。

最简单的解决方案是忽略这个问题

考虑一下简单的[0,1]情况。我不知道你希望给上界赋值的概率是多少,但最大的合理概率是1.0和小于1.0的最大双精度之间的绝对差。这个差值是2-53,大约1.11e-16,这是一个很小的概率


1e9试验中得不到1.0分的概率为0.9999998889777038。

最简单的解决方案是忽略这个问题

考虑一下简单的[0,1]情况。我不知道你希望给上界赋值的概率是多少,但最大的合理概率是1.0和小于1.0的最大双精度之间的绝对差。这个差值是2-53,大约1.11e-16,这是一个很小的概率


1e9试验中得不到1.0分的概率为0.9999998889777038。

一种方法是使用以下代码:

Random r = ThreadLocalRandom.current();
return min + ((double)r.nextLong(9007199254740993L) / 
     9007199254740992.0) * (max - min);
请注意,部分代码生成小于9007199254740993(253+1)的
long

将其除以253,得到0或更大的数字,以及1或更小的数字。还有一个更复杂的方法,以及你的问题的某些微妙之处,我将详细描述;但是,本文中给出的方法很可能足以满足您的需要。

一种方法是使用以下代码:

Random r = ThreadLocalRandom.current();
return min + ((double)r.nextLong(9007199254740993L) / 
     9007199254740992.0) * (max - min);
请注意,部分代码生成小于9007199254740993(253+1)的
long

将其除以253,得到0或更大的数字,以及1或更小的数字。还有一个更复杂的方法,以及你的问题的某些微妙之处,我将详细描述;然而,本文中给出的方法很可能足以满足您的目的。

您计算过这成为问题的概率吗?您计算过这成为问题的概率吗?