0

簡単な質問がありますが、乱数の生成に少し慣れていません。大きな奇数の整数を生成したいのですが (数値が int の範囲外になる可能性があるため、double を使用しています)、乱数の生成で小数を取り除き、数値を奇数にする方法がわかりません。

今私はちょうど持っています:

N = nMin + (nMax - nMin) * rand.nextDouble();

私が言ったように、nMin と nMax の間の任意の乱数 (小数を含む) が得られます。どんな助けでも大歓迎です!

4

3 に答える 3

6

数値が int の範囲外になる可能性がある場合は、 を使用するlongか、それで失敗する必要がありますBigInteger

この質問の情報を使用してランダムな を作成し、ランダムBigIntegerである場合は単純に 1 を追加します。

BigInteger randomOdd(BigInteger min, BigInteger max) {
    BigInteger range = max.subtract(min);

    // expected iterations: 2 - max iterations: infinite
    BigInteger tmp;
    do {
        tmp = new BigInteger(n.bitLength(), rng); // rng is your Random Number Generator
    } while (tmp.compareTo(range) >= 0);

    BigInteger result = min.add(tmp);

    // force the result to be odd
    // TODO: will this push it over max?
    result = result.or(BigInteger.ONE); 

    return result;
}

または、BigInteger クラスのメソッドを使用することもできますBigInteger.probablePrime():

public static BigInteger probablePrime(int bitLength, Random rnd)

BigInteger指定されたで、おそらく素数である陽性を返しますbitLength。このメソッドによって返される BigInteger が複合である確率は を超えません2^100

パラメーター:

  • bitLength - 返された の bitLength BigInteger
  • rnd - 素数性をテストする候補を選択するために使用されるランダム ビットのソース。

戻り値:

  • BigIntegerおそらく素数である bitLength ビットのa

それがおそらく素数であるなら、それはおそらく奇数でもあります。

于 2012-09-11T21:44:37.407 に答える
1

(long)(expression)(64 ビット整数) にキャストexpressionし、小数点以下を切り捨てます (したがって、実質的にゼロに丸めます)。long奇数を作成するには、最初に整数を作成し、次にそれを 2 倍して1 を足します (恥ずかしい編集)。nMin(おそらく、どのように調整する必要があるか、また自分で計算することができるでしょうnMax。:-) )

于 2012-09-11T21:43:15.873 に答える
0

小数を取り除くことはよくある問題です。1 つのトリックは、100 を掛けてから、その結果を int (または long) にキャストすることです。これはあなたが慣れるための良い練習です!!

于 2012-09-11T21:43:04.880 に答える