首頁  >  文章  >  Java  >  如何在Java中產生特定範圍內的隨機BigInteger值?

如何在Java中產生特定範圍內的隨機BigInteger值?

Barbara Streisand
Barbara Streisand原創
2024-10-25 03:51:45743瀏覽

How to Generate Random BigInteger Values within a Specific Range in Java?

在Java 中產生特定範圍內的隨機BigInteger 值

在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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn