C#による Mersenne Twister の実装
修正の概要
KiT様より、MersenneTwister.cs に System.Random を継承したクラスとしては不適切な点がある事をご指摘頂きました。 ご指摘頂いた内容は
Next()メソッドが、Int32.MaxValueを返す場合がある。
System.RandomのNext()メソッドの戻り値は、0以上で
Int32.MaxValue「より小さい」値となっています。
Next(int maxValue)メソッドが、maxValueを返す場合がある。
System.RandomのNext(int maxValue)メソッドの戻り値は、
0以上maxValue未満です。
約40億回に1回の割合で、maxValueが返されてしまいます。
Next(int minValue, int maxValue)メソッドの実装が不適切。
System.Randomでは、minValueとmaxValueが等しい場合には、
例外は発生せずminValueが返されます。
また、2と同様に、約40億回に1回の割合で、maxValueが返されてしまいます。
NextBytes(byte[] buffer)の返り値が均等でない。
this.GenerateUInt() / (uint.MaxValue / byte.MaxValue)
上式の場合、演算の優先順位の関係で、uint.MaxValue / byte.MaxValueの
余りが切り捨てられ、255だけが約40億回に1回しか返ってこなくなります。
NextDouble()メソッドが、1.0を返す場合がある。
System.RandomのNextDouble()メソッドの戻り値は、0以上1未満の値です。
約40億回に1回の割合で1.0が返されてしまいます。
以上の問題を踏まえて下記のメソッドを修正しました。
public int Next();
public int Next(int);
public int Next(int, int);
public void NextBytes(byte[]);
public double NextDouble();
独自に定義した
public virtual uint NextUInt();
public virtual uint NextUInt(uint maxValue);
public virtual uint NextUInt(uint minValue, uint maxValue);
についてはSystem.Randomとの互換性を取る必要がない事、キャストなしで最大値を指定したいであろうという推測から変更は加えていません。
<< Back to home >>
このページとここで公開しているファイルに関して、どんな些細な事でもフィードバックを頂けると嬉しいです。
Copyright (C) 2001-2004 Takel Hinomoto. <
admin@takel.jp
>
All rights reserved.