簡単な質問がありますが、乱数の生成に少し慣れていません。大きな奇数の整数を生成したいのですが (数値が int の範囲外になる可能性があるため、double を使用しています)、乱数の生成で小数を取り除き、数値を奇数にする方法がわかりません。
今私はちょうど持っています:
N = nMin + (nMax - nMin) * rand.nextDouble();
私が言ったように、nMin と nMax の間の任意の乱数 (小数を含む) が得られます。どんな助けでも大歓迎です!
簡単な質問がありますが、乱数の生成に少し慣れていません。大きな奇数の整数を生成したいのですが (数値が int の範囲外になる可能性があるため、double を使用しています)、乱数の生成で小数を取り除き、数値を奇数にする方法がわかりません。
今私はちょうど持っています:
N = nMin + (nMax - nMin) * rand.nextDouble();
私が言ったように、nMin と nMax の間の任意の乱数 (小数を含む) が得られます。どんな助けでも大歓迎です!
数値が 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
それがおそらく素数であるなら、それはおそらく奇数でもあります。
(long)(expression)
(64 ビット整数) にキャストexpression
し、小数点以下を切り捨てます (したがって、実質的にゼロに丸めます)。long
奇数を作成するには、最初に整数を作成し、次にそれを 2 倍して1 を足します (恥ずかしい編集)。nMin
(おそらく、どのように調整する必要があるか、また自分で計算することができるでしょうnMax
。:-) )
小数を取り除くことはよくある問題です。1 つのトリックは、100 を掛けてから、その結果を int (または long) にキャストすることです。これはあなたが慣れるための良い練習です!!