在需要產生指定範圍內的任意大隨機整數的情況下,常見的方法可能涉及使用nextDouble() 並相乘輸出達到所需的限制。但是,對於超過 2^53 的值,此方法會出現問題,導致分佈不均勻。
為了克服此限制,Java 提供了 BigInteger 類,該類提供了一個構造函數,可以產生在 0 到 0 之間均勻分佈的隨機數(2^numBits - 1),包含在內。
產生0 到n 範圍內的隨機值,其中n不是2 的冪,可以採用簡單的循環:
<code class="java">BigInteger randomNumber; do { randomNumber = new BigInteger(upperLimit.bitLength(), randomSource); } while (randomNumber.compareTo(upperLimit) >= 0);</code>
此迭代方法可確保在所需範圍內均勻分佈。通常,只需要一次或兩次迭代。
對於隨機數產生器計算成本較高的場景,可以如下限制循環中的迭代次數:
<code class="java">int nlen = upperLimit.bitLength(); BigInteger nm1 = upperLimit.subtract(BigInteger.ONE); BigInteger randomNumber, temp; do { temp = new BigInteger(nlen + 100, randomSource); randomNumber = temp.mod(upperLimit); } while (s.subtract(randomNumber).add(nm1).bitLength() >= nlen + 100);</code>
這個修改後的版本極不可能需要多次迭代(機率小於2^100)。然而,由於 mod() 操作,它會產生計算損失。因此,僅當隨機數產生器特別慢時才建議使用。
以上是## 如何在 Java 中產生特定範圍內的隨機 BigInteger 值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!