用Java產生隨機大整數
問題:
如何產生任意大的隨機數BigInteger 值在0 到n(不包括n)範圍內,其中n 不是2 的冪?
答案:
利用BigInteger 的建構函數,建構函數需要一點時間count 和隨機產生器的實例,您可以建立這樣的值:
public BigInteger(int numBits, Random rnd)
但是,要獲得所需範圍內的值,需要使用循環:
BigInteger randomNumber; do { randomNumber = new BigInteger(upperLimit.bitLength(), randomSource); } while (randomNumber.compareTo(upperLimit) >= 0);
平均而言,此循環的迭代次數少於兩次,確保均勻分佈。
編輯:
對於隨機產生器效能密集的情況,您可以實現以下方法:
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);
雖然此方法顯著降低了多次循環迭代的可能性(小於2^100 中的一次),但它利用了計算量大的mod() 操作。因此,如果提供的 Random 實例的效能開銷較低,則這種方法的效率可能會低於前一種方法。
以上是如何在Java中產生特定範圍內的任意大的隨機BigIntegers?的詳細內容。更多資訊請關注PHP中文網其他相關文章!