http://docs.oracle.com/javase/6/docs/api/java/util/Random.html#nextInt%28int%29言います:
アルゴリズムは少しトリッキーです。(2^31 は n で割り切れないため) 不均一な分布になる値は拒否されます。値が拒否される確率は、n によって異なります。最悪のケースは n=2^30+1 で、リジェクトの確率は 1/2 で、ループが終了するまでの予測反復回数は 2 です。
アルゴリズム:
int bits, val;
do {
bits = next(31);
val = bits % n;
} while (bits - val + (n-1) < 0);
n > 2^30
このコードは、とのケースをテストしbits > n
ます。次に、最上位ビットが設定され、条件の結果が負の 1 になります。
bits
せいぜい2^31-1
=>50%の確率があることを理解しています。bits
< 2^30 または 2^30 ~ 2^31 のいずれかです。
ともかく、
- なぜ2^31 は n で割り切れないのですか?
- 両方の数値が > 2^30 の場合にのみ効果があるのはなぜですか?
二項除算の魔法、一様分布を破るオーバーフローだと思いますか?
ありがとうございました!