指定された範囲内で任意に大きいランダムな整数を生成する必要があるシナリオでは、一般的なアプローチとして nextDouble() を使用して乗算することが考えられます。希望の制限による出力。ただし、この方法は 2^53 を超える値の場合に問題が発生し、不均一な分布が発生します。
この制限を克服するために、Java には BigInteger クラスが用意されており、このクラスは 0 と 2 の間で均一に分布する乱数を生成するコンストラクターを提供します。 (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>
この反復アプローチにより、目的の範囲内で均一な分布が保証されます。通常、必要な反復は 1 つまたは 2 つだけです。
乱数ジェネレーターの計算コストが高いシナリオでは、ループ内の反復数を次のように制限できます。 :
<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 中国語 Web サイトの他の関連記事を参照してください。