获取包含最大值的随机double(Java-ThreadLocalRandom)

问题描述:

我有一种方法可以获取min和max值之间的随机double。我的问题是,如果这些值是例如0D和10D,我从来没有获得10D作为可能的结果,因为nextDouble第二个参数是排他性的。获取包含最大值的随机double(Java-ThreadLocalRandom)

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); 
} 

是否有解决此问题的另一种解决方案?

+0

你计算过这个问题的概率是多少? – biziclop

我想你可以这样做:

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

但是:虽然这种方法将你的最大添加到您可能的结果,得到了确切的最大值或最小值的概率实际上只有一半大任何其他数字可能具有的概率。

这意味着它几乎是一样的:

double result = ThreadLocalRandom.current().nextDouble(min, max); 
if (result == min && Thread.LocalRandom.current().nextDouble() < 0.5) { 
    result = max; 
} 
return result; 

一个稍微好一点的办法可能是

double result = ThreadLocalRandom.current().nextDouble(min, max); 
if (result != min) { 
    result = max - ThreadLocalRandom.current().nextDouble(0, max - min); 
} 
return result; 

的概率仍然不平衡,但最多实际上具有相同的概率看起来一切除了分钟呢。 min的概率稍大一些(但实际上只是非常小,甚至不能与之前的情况相比)。

最简单的解决方案是忽略该问题。

只考虑简单的[0,1]情况。我不知道你想分配给上限的概率是多少,但最大的合理概率是1.0和最大双数之间的绝对差值小于1.0。这个差别是大约1.11e-16,这是一个非常小的概率。

在1e9试验中没有得到1.0的概率将是0.9999998889777038。要做到这一点

的一种方法是使用下面的代码:由2

Random r = ThreadLocalRandom.current(); 
return min + ((double)r.nextLong(9007199254740993L)/
    9007199254740992.0) * (max - min); 

注意,代码的一部分生成long小于9007199254740993(2 1)和 划分53,得到数字0或更大,以及1或更小。还有一个更复杂的方法,以及您的问题的某些细微之处,我详细描述了on another page;然而,在这篇文章中给出的方法很可能足以满足您的需要。