Java プログラミングで、所定の範囲内でランダムな BigInteger 値を生成するには、一様な分布と計算効率を確保するために慎重な考慮が必要です。 。最初は nextDouble の結果に上限を乗算する方法を考えますが、倍精度の制限 (253) を超える値を扱う場合、このアプローチには問題が生じます。
これに対処するにはこのコンストラクターは、0 ~ (2
numBitspublic BigInteger(int numBits, Random rnd)
解決策:
解決策は、ループを使用することです:
平均して、このループは 2 回未満で実行され、均一な分散が保証されます。
<code class="java">BigInteger randomNumber; do { randomNumber = new BigInteger(upperLimit.bitLength(), randomSource); } while (randomNumber.compareTo(upperLimit) >= 0);</code>
高価な RNG の最適化:
選択した RNG の計算量が多い場合、反復回数を制限できます。
このバージョンでは、ループが複数回横断される可能性が大幅に減少します (2 回に 1 回未満
100<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>
以上がJavaで特定の範囲内でランダムなBigInteger値を生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。