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 サイトの他の関連記事を参照してください。