2017-07-25 61 views
1

我有一種方法可以獲取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

回答

1

我想你可以這樣做:

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的概率稍大一些(但實際上只是非常小,甚至不能與之前的情況相比)。

2

最簡單的解決方案是忽略該問題。

只考慮簡單的[0,1]情況。我不知道你想分配給上限的概率是多少,但最大的合理概率是1.0和最大雙數之間的絕對差值小於1.0。這個差別是大約1.11e-16,這是一個非常小的概率。

在1e9試驗中沒有得到1.0的概率將是0.9999998889777038。要做到這一點

1

的一種方法是使用下面的代碼:由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;然而,在這篇文章中給出的方法很可能足以滿足您的需要。

相關問題