此問題:How to generate a random BigInteger描述了一種爲BigIntegers實現與Random.nextInt(int n)相同的語義的方法。如何在Java中創建隨機BigDecimal?
我想爲BigDecimal和Random.nextDouble()做同樣的事情。
上述問題中的一個答案建議創建一個隨機BigInteger,然後用隨機比例創建一個BigDouble。一個非常快的實驗表明這是一個非常糟糕的主意:)
我的直覺是,使用這種方法需要整數通過像
n-log10(R)
,其中n是精度數字在所要求的數量進行縮放輸出,R是隨機BigInteger。這應該允許存在正確的數字位數,以便(例如)1 - > 10^-64和10^64 - > 1.
縮放值也需要正確選擇以使結果下降在[0,1]的範圍內。
有沒有人做過這件事,他們知道結果是否正確分發?有沒有更好的方法來實現這一目標?
編輯:感謝@biziclop糾正我對尺度參數的理解。以上是不必要的,恆定比例因子具有期望的效果。
爲便於以後參考,我的(顯然是工作的代碼)是:
private static BigDecimal newRandomBigDecimal(Random r, int precision) {
BigInteger n = BigInteger.TEN.pow(precision);
return new BigDecimal(newRandomBigInteger(n, r), precision);
}
private static BigInteger newRandomBigInteger(BigInteger n, Random rnd) {
BigInteger r;
do {
r = new BigInteger(n.bitLength(), rnd);
} while (r.compareTo(n) >= 0);
return r;
}
這樣做的結果是不均勻分佈的。我試過了,結果是均勻分佈在小數部分的,這意味着10^-27與0.01到0.1之間的數字出現在結果中的可能性相同。 10^-27應該比範圍在0.1-0.01之間的數字出現的可能性要小26個數量級 – 2011-02-04 16:25:16
@Mike Houston我錯過了顯而易見的,因爲我仍然不明白。你希望它是否均勻分佈? – biziclop 2011-02-04 16:28:24
@Mike Houston Nope,依然不明白。如果採用一個最多n位數的均勻分佈的變量,並將其除以10^n,它仍然是均勻分佈的。 – biziclop 2011-02-04 16:31:32