在Java 程式設計中,產生規定範圍內的隨機BigInteger 值需要仔細考慮,以確保均勻分佈和計算效率。人們最初可能會將 nextDouble 的結果乘以上限,但是當處理超出雙精度限制 (253) 的值時,這種方法會出現問題。
要解決這個問題對於這個問題,BigInteger 類別提供了一個合適的建構子:
public BigInteger(int numBits, Random rnd)
這個建構子產生一個0 到(2numBits - 1) 範圍內的隨機BigInteger,確保均勻分佈。然而,挑戰仍然在於取得所需範圍(0 到 n)內的值,其中 n 不一定是 2 的冪。
解決方案:
一種有效的方法解決方案是使用循環:
<code class="java">BigInteger randomNumber; do { randomNumber = new BigInteger(upperLimit.bitLength(), randomSource); } while (randomNumber.compareTo(upperLimit) >= 0);</code>
平均而言,該循環將執行少於兩次,確保均勻分佈。
針對昂貴的RNG 的最佳化:
如果選擇的RNG 計算量較大,則可以限制迭代次數:
<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>
此版本顯著降低了循環遍歷多次的可能性(小於二分之一100)。然而,mod() 操作的計算成本很高,因此這種最佳化只有在 RNG 實例特別慢的情況下才有用。
以上是如何在Java中產生特定範圍內的隨機BigInteger值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!