ホームページ  >  記事  >  Java  >  Javaで特定の範囲内で均一に分散されたランダムなBigInteger値を生成する方法は?

Javaで特定の範囲内で均一に分散されたランダムなBigInteger値を生成する方法は?

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

How to Generate Uniformly Distributed Random BigInteger Values within a Specific Range in Java?

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

Java では、大きな数値を扱う場合、指定された範囲内のランダムな整数を生成するのが困難になることがあります。この問題は、乱数生成に nextDouble() などの従来のメソッドを使用する場合に発生します。生成された値が 253 の制限を超えて均一に分散されない可能性があるためです。

BigInteger コンストラクターの使用

これに対処するために、BigInteger クラスは、指定されたビット範囲内で均一に分散されたランダムな BigInteger 値の作成を可能にするコンストラクターを提供します。

BigInteger コンストラクターを構築します。

<code class="java">public BigInteger(int numBits, Random rnd)</code>

このコンストラクターは 2 つのパラメーターを取ります:

  • numBits: 生成される値のビット数を指定します
  • rnd: ランダム値の生成に使用される Random オブジェクト

範囲内のランダム値の生成

範囲内でランダムな値を生成するには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 サイトの他の関連記事を参照してください。

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