java.util.RandomはJavaの初期からあるが、
範囲を指定した整数乱数(0 以上 n-1 以下)を得る
public int nextInt(int n);
というメソッドがある。
しかしこれはバージョン 1.2 のときに導入された
もので、1.1 以下では存在しないので自前で用意する必要がある。
ちなみに、実装されているメソッドのソースは以下の
ようなものである。
このアルゴリスムよくわからない。出典も不明。
単に、
return (int)((n * (long)next(31)) >> 31);
だけじゃダメなのだろうか?
範囲を指定した整数乱数(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; }
※コメント投稿者のブログIDはブログ作成者のみに通知されます