获取包含最大值的随机双精度(Java-ThreadLocalRandom)
我有一个方法来获得一个最小值和最大值之间的随机双精度。我的问题是,如果值是例如0D和10D,我永远不会得到10D作为可能的结果,因为nextDouble第二个参数是独占的获取包含最大值的随机双精度(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的结果,但我不知道这是否是一个好
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或更小的数字。还有一个更复杂的方法,以及你的问题的某些微妙之处,我将详细描述;然而,本文中给出的方法很可能足以满足您的目的。您计算过这成为问题的概率吗?您计算过这成为问题的概率吗?