Interstage Application Serverにおける、java.util.RandomクラスのnextInt(int n)メソッドの返却値について

java.util.RandomクラスのnextInt(int n)メソッドを繰り返し呼び出すと、同じ値が続けて返される場合があるのはなぜですか?また、nextInt(int n)メソッドの引数に2の累乗(2,4,8,16,・・・)を指定すると、2の累乗以外の値を指定した時と比較して、より同じ値が続けて返される傾向があるのはなぜですか?
[原因]
java.util.Randomクラスのインスタンスを短時間に作成した場合、それぞれのインスタンスのシードが同じになる傾向が強くなります。この場合、同じシードのRandomインスタンスに対するnextInt(int n)メソッドの呼び出しになりますので、同じ値を返すことになります。
また、nextInt(int n)メソッドの引数が2の累乗とそれ以外でアルゴリズムが違います。このため、2の累乗を指定した時の方が、より同じ値が続けて返される傾向になります。

[対処方法]
乱数の特性上、このような傾向は好ましくないため、Randomクラスを利用する場合は、乱数をとる都度にRandomクラスのインスタンスを作成するのではなく、1つのRandomクラスインスタンスに対して、nextInt(int n)メソッドを繰り返し呼び出してください。
引数に指定する値が2の累乗の場合は、2の累乗以外の場合とアルゴリズムが異なるため、同じ値が続けて返される傾向があります。詳細は、JDKのAPI仕様を参照してください。なお、繰り返し乱数生成する場合でも、java.util.Randomクラスのインスタンスを保持した状態、すなわち、コンストラクタの作成(new Random())は一度だけにして、nextInt(int n)メソッドを呼び出すようにしてください。

製品・サービス区分 Interstage
製品・サービス情報
対象製品 Interstage Application Server
バージョン V9, V8, V7, V6, V5, V4, V3, V2
プラットフォーム Windows, Solaris, Linux
アンサー種別 運用/保守
このページの先頭へ