<紙>さんLOG

「パソコンヲタクの雑記帳」
 PC/Linux系/物理・化学で遊んでいます。
思いついたことを綴っています。

C(gcc) 入門(9)乱数

2010年06月06日 | PCクリニック
ご訪問ありがとうございます。


数値計算シミュレーションと云えば、「乱数」が付きものですね。
乱数と云えば、メルセンヌ・ツイスタ(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 から離れられます。     



見ていただきありがとうございました。
お帰りに投票して頂けると嬉しいです。 ⇒ blogram投票ボタン

日記@BlogRanking    

最新の画像もっと見る

2 コメント

コメント日が  古い順  |   新しい順
Unknown (deepblur)
2010-06-08 16:10:53
乱数といえば MT とはまさにその通りですよね。

ただ、ついつい楽なんで NR の ran2 を使ってしまうことも多いです(汗)

また、モンテカルロシミュレーションでスピードアップしたい時には擬似乱数を捨てて、準乱数(超一様分布列)を使うことも、ままあります。

それぞれ一長一短ですが、MTだと安心できますよね。
返信する
deepblur さんへ (<紙>)
2010-06-08 20:28:26
いらっしゃいませ。
まあ、いろいろありますが、・・・・・
<紙>は、MT の高性能さに甘えて、
シミュレーション計算4回につき、MT乱数発生1回で、高速化を行っています。

今後とも、宜しくお願い致します。
返信する

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。