開発覚え書き

ソフトウェアシステムの開発に関わるさまざまなことの覚え書き

java.util.RandomのnextIntメソッド

2005-11-28 11:39:06 | Weblog
java.util.RandomはJavaの初期からあるが、
範囲を指定した整数乱数(0 以上 n-1 以下)を得る
     public int nextInt(int n);
というメソッドがある。
しかしこれはバージョン 1.2 のときに導入された
もので、1.1 以下では存在しないので自前で用意する必要がある。
ちなみに、実装されているメソッドのソースは以下の
ようなものである。
このアルゴリスムよくわからない。出典も不明。
単に、
     return (int)((n * (long)next(31)) >> 31);
だけじゃダメなのだろうか?

public int nextInt(int n) {
     if (n <= 0)
	throw new IllegalArgumentException("n must be positive");
     if ((n & -n) == n) // n が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;
 }