ホームページ  >  記事  >  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) を超える値を扱う場合、このアプローチには問題が生じます。

これに対処するにはこのコンストラクターは、0 ~ (2

numBits
public BigInteger(int numBits, Random rnd)
- 1) の範囲内でランダムな BigInteger を生成し、均一な分散を保証します。ただし、目的の範囲 (0 から n) 内の値を取得するという課題が残ります。ここで、n は必ずしも 2 の累乗である必要はありません。

解決策:

解決策は、ループを使用することです:

平均して、このループは 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>
)。ただし、mod() 操作は計算コストが高いため、この最適化は RNG インスタンスが特に遅い場合にのみ有益となる可能性があります。

以上がJavaで特定の範囲内でランダムなBigInteger値を生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。