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 | ||||||
---|---|---|---|---|---|---|---|
製品・サービス情報 |
|
||||||
アンサー種別 | 運用/保守 |