C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 24 を表示中)
■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以下になったら最大値に戻すという方法です。
これはかなり良い乱数生成法です。
いくつか欠点がありますが、速度もメモリ使用率も分布の仕方もよい方法です。
とくに初期化が難しいので、変な種を入れるとダメなときがあります。
返信 編集キー/


管理者用

- Child Tree -