ホームページ  >  記事  >  Java  >  Javaで特定の範囲で任意に大きなランダムなBigIntegerを生成するにはどうすればよいですか?

Javaで特定の範囲で任意に大きなランダムなBigIntegerを生成するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-25 01:02:30407ブラウズ

How to Generate Arbitrarily Large Random BigIntegers in a Specific Range in Java?

Java でのランダムな BigInteger の生成

質問:

任意の大きさのランダムを生成するにはどうすればよいですか? 0 ~ n の範囲の BigInteger 値 (n を除く) (n は 2 の累乗ではありません)?

答え:

ビットを要する BigInteger のコンストラクターを利用するcount と Random ジェネレーターのインスタンスを使用して、次のような値を作成できます:

public BigInteger(int numBits, Random rnd)

ただし、目的の範囲内の値を取得するには、ループを使用する必要があります:

BigInteger randomNumber;
do {
    randomNumber = new BigInteger(upperLimit.bitLength(), randomSource);
} while (randomNumber.compareTo(upperLimit) >= 0);

平均して、このループは 2 回未満の反復で動作し、均一な分散が保証されます。

編集:

ランダム ジェネレータがパフォーマンスを重視する状況では、次のことができます。次のアプローチを実装します。

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 分の 1 未満の確率) が、計算コストの高い mod() 操作を利用します。したがって、提供された Random インスタンスのパフォーマンス オーバーヘッドが低い場合、このアプローチは前のアプローチよりも効率が低くなる可能性があります。

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

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