プロが教えるわが家の防犯対策術!

Java 2 (1.4) のドキュメントによれば、java.util.Random#nextInt(int n) の実装は



public int nextInt(int n) {
if (n<=0)
throw new IllegalArgumentException("n must be positive");

if ((n & -n) == n) // i.e., n is a power of 2
return (int)((n * (long)next(31)) >> 31);

int bits, val;
do {
bits = next(31);
val = bits % n;
} while(bits - val + (n-1) < 0);
return val;
}
となっているようですが、
 return (int) (getDouble() * n) ; // もっとも簡単な実装
ではないのは何故ですか。精度上の問題があるのでしょうか?

A 回答 (1件)

>  return (int) (getDouble() * n) ; // もっとも簡単な実装


> ではないのは何故ですか。精度上の問題があるのでしょうか?
getDoubleって乱数を返すんだっけ?
調べたところ、乱数を取得できるのはnextDoubleのようなので
nextDoubleの間違いだと解釈しますね。

まずその方法には、得られる乱数がちゃんと一様分布しないという問題点があります。
nextDoubleは2の53乗通りの値を均等な確率で生成するので、
2の53乗を割り切ることができない値をnとすると必ず出現確率が偏ります。

あとは、その記述は書くのが楽なだけで、
nextDouble()内での2回のnextの呼び出しやシフト演算や除算や型変換、
そして最後のdoubleからintへの型変換など無駄な処理が多いです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!