■10663 / ) |
Re[1]: Rnd関数について |
□投稿者/ れい (226回)-(2007/11/23(Fri) 11:34:18)
|
■No10662 (VBファン さん) に返信 > 乱数を発生させるRnd関数ですが、このライブラリはどのようにできているのですか? > わかる方がおりましたら、VBかC#のコードでおしえてください。
コードはわかりません。 非公開だと思います。 あと2〜3週間したらわかるかもしれませんが。
わかる範囲で答えると。
VBMath.Rndは伝統的に線形合同法になっています。 24bitの掛け算と足し算、剰余の計算で導かれます。 x = (x * A + B) % 0xFFFFFF で計算しています。 AとBの値は知りませんが、 Rndを2回呼んで連立方程式を解けばわかります。 知りたければご自分でどうぞ。 すぐにわかりますが、乱数としてはかなり問題があります。 乱数の品質の割には速度も遅く、ろくに分布もしてくれないので、 使わないほうがいいでしょう。
System.RandomはKnuthの引き算法です。 配列に種を入れておいて、前後の値を引き、0以下になったら最大値に戻すという方法です。 これはかなり良い乱数生成法です。 いくつか欠点がありますが、速度もメモリ使用率も分布の仕方もよい方法です。 とくに初期化が難しいので、変な種を入れるとダメなときがあります。
|
|