ご訪問ありがとうございます。
数値計算シミュレーションと云えば、「乱数」が付きものですね。
乱数と云えば、メルセンヌ・ツイスタ(Mersenne twister)法ですね。
それも、「MT19937」でしょうか。
日本人(松本眞と西村拓士)によって開発された、
ある意味、最高性能の「擬似乱数生成器」と思っています。
従来(今でも?)、Active BASIC で使っていた、MT19937 は、
本家のC言語版を、某氏が、Active BASIC に移植したものです。
C(gcc) 入門(5)「gsl」で「Active BASIC」から2歩(?)離れましたが、
C(gcc) では、どうしようか?
本家のC版を使おうか、と勉強していました。
でも、結構面倒(?)だなと悩んでいました。
そんなときに、「gsl」にも「乱数」があることに気付き、。
それを、調べてみると、
各種の乱数発生手法が用意されており、
デフォルトでは、MT19937 になっていました。
これは、使わない手は無い。
いろいろ、テストをしてみた結果、
gsl_rng_・・・ 関数を使って、
以下の3つの関数を作れば良さそうです。
void MT19937_ini ( int seed ); // 乱数初期化
double MT19937_get ( void ); // [0,1) 一様乱数取得
void MT19937_end ( void ); // 乱数生成終了
そうすると、
テスト・プログラムは、こんな感じでしょうか?
クリックで拡大(別窓)
Relo2 環境で、MinGW でコンパイル・リンク・実行、結果は、
クリックで拡大(別窓)
でした。
これで、また1歩、Active BASIC から離れられます。
見ていただきありがとうございました。
お帰りに投票して頂けると嬉しいです。 ⇒
数値計算シミュレーションと云えば、「乱数」が付きものですね。
乱数と云えば、メルセンヌ・ツイスタ(Mersenne twister)法ですね。
それも、「MT19937」でしょうか。
日本人(松本眞と西村拓士)によって開発された、
ある意味、最高性能の「擬似乱数生成器」と思っています。
従来(今でも?)、Active BASIC で使っていた、MT19937 は、
本家のC言語版を、某氏が、Active BASIC に移植したものです。
C(gcc) 入門(5)「gsl」で「Active BASIC」から2歩(?)離れましたが、
C(gcc) では、どうしようか?
本家のC版を使おうか、と勉強していました。
でも、結構面倒(?)だなと悩んでいました。
そんなときに、「gsl」にも「乱数」があることに気付き、。
それを、調べてみると、
各種の乱数発生手法が用意されており、
デフォルトでは、MT19937 になっていました。
これは、使わない手は無い。
いろいろ、テストをしてみた結果、
gsl_rng_・・・ 関数を使って、
以下の3つの関数を作れば良さそうです。
void MT19937_ini ( int seed ); // 乱数初期化
double MT19937_get ( void ); // [0,1) 一様乱数取得
void MT19937_end ( void ); // 乱数生成終了
そうすると、
テスト・プログラムは、こんな感じでしょうか?
クリックで拡大(別窓)
Relo2 環境で、MinGW でコンパイル・リンク・実行、結果は、
クリックで拡大(別窓)
でした。
これで、また1歩、Active BASIC から離れられます。
見ていただきありがとうございました。
お帰りに投票して頂けると嬉しいです。 ⇒
ただ、ついつい楽なんで NR の ran2 を使ってしまうことも多いです(汗)
また、モンテカルロシミュレーションでスピードアップしたい時には擬似乱数を捨てて、準乱数(超一様分布列)を使うことも、ままあります。
それぞれ一長一短ですが、MTだと安心できますよね。
まあ、いろいろありますが、・・・・・
<紙>は、MT の高性能さに甘えて、
シミュレーション計算4回につき、MT乱数発生1回で、高速化を行っています。
今後とも、宜しくお願い致します。