Java でのランダムな BigInteger 値の生成
Java では、大きな数値を扱う場合、指定された範囲内のランダムな整数を生成するのが困難になることがあります。この問題は、乱数生成に nextDouble() などの従来のメソッドを使用する場合に発生します。生成された値が 253 の制限を超えて均一に分散されない可能性があるためです。
BigInteger コンストラクターの使用
これに対処するために、BigInteger クラスは、指定されたビット範囲内で均一に分散されたランダムな BigInteger 値の作成を可能にするコンストラクターを提供します。
BigInteger コンストラクターを構築します。
<code class="java">public BigInteger(int numBits, Random rnd)</code>
このコンストラクターは 2 つのパラメーターを取ります:
範囲内のランダム値の生成
範囲内でランダムな値を生成するには0 ~ n (両端を含む) の 2 のべき乗ではない範囲では、ループを利用できます。
<code class="java">BigInteger randomNumber; do { randomNumber = new BigInteger(upperLimit.bitLength(), randomSource); } while (randomNumber.compareTo(upperLimit) >= 0);</code>
このループは、有効なランダム値が取得されるまで反復されます。これにより、生成された値が指定された範囲内で均一に分散されることが保証されます。
反復回数の最適化
ループの反復回数を減らすために、より洗練されたソリューションを適用できます。 .
<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 サイトの他の関連記事を参照してください。