- ベストアンサー
セルフテストモンテカルロ法のプログラム
今、モンテカルロ法の勉強をしており、いろいろ調べていったらセルフテストモンテカルロ法というものがありました。文献をいろいろ読み、原理はなんとなくわかったのですが、C言語でのプログラミングをどのようにすればよいのか思い付きません。一例で良いのでわかる方、御回答をよろしくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#3です。なんか、計算間違ってるし。9のモジュラス取って1足せば…循環するか。 とりあえず、その他のところはこんな感じでしょうか。 #define RANDBUFFSIZE 100 static int randBuff[RANDBUFFSIZE]; static int randPtr = -1; static void getInitialRandom() { /* randBuffに初期乱数を与える */ } static int transformation(int X) { /* 乱数に変化を与える */ } int getRandom() { int ret; if (randPtr < 0) { getInitialRandom(); randPtr = 0; } else if (randPtr >= RANDBUFFSIZE) { randPtr = 0; } ret = randBuff[randPtr]; randBuff[randPtr] = transformation(randBuff[randPtr]); randPtr++; return ret; } 最初に100個の乱数を作り、バッファに入れています。そして取り出したら関数に渡して別の数に変更します。ポインタは100個をグルグル回りますが、次に来たときは別の数に変わっています。 有限個の乱数を基に、無限個の乱数が作れるわけか。メモリが少なくても、数が循環しないし、巨大な乱数表を持たなくても良い、ということですね。
その他の回答 (3)
- はなおか じった(@Jitta)
- ベストアンサー率42% (69/161)
乱数があることが前提のようですね。 で、「写像」ですが、 http://ja.wikipedia.org/wiki/写像 こちらによると「関数」と同義であると。 ということは、例えば円周率の各桁を「1桁の乱数」とすると、 3, 1, 4, 1, 5, 9, 2, ... という乱数が得られたとします。この得られた乱数を何らかの関数を通し、別の数字(乱数)にすると。例えば int func(int x) { return (x * x) % 10; } という関数を通すと、 9, 1, 6, 1, 0, 8, 4, ... という乱数が得られると。いい式じゃないですね。0は永久に0だし、1は永久に1だし。 まぁ、それを解決したとして、その結果を蓄えておいて、もう一度通すことによって別の乱数を得る。が、延々と続く。 ということですかね。
お礼
御回答ありがとうございます。 参考にして、自分なりの方法を考えてみます。
- tatsu99
- ベストアンサー率52% (391/751)
補足から推測すると、セルフテストモンテカルロ法は2段階に分かれると思います。 段階1.πの値等の乱数列の取得 段階2.上記の写像を取り再利用すること 段階1については、スーパーπなどの円周率を計算するソフトがあるので、その出力結果を順に読み込めば、実現出来ると思います。 段階2については、私は残念ながら、そのアルゴリズムが解りません。そのアルゴリズムをあなたから提示していただければ、更に良い回答が得られると思います。
- tatsu99
- ベストアンサー率52% (391/751)
セルフテストモンテカルロ法の原理はどのようなものなのでしょうか?それを説明していただけると、良い回答が得られると思います。
補足
早速のお返事ありがとうございます。 私もまだ勉強中の身なので、あまり詳しくはお答えできませんが、わかっている範囲でお答えします。 まず、ランダムが保証されている数列(円周率 π など)をいくつかに区切って、それの写像をとり再利用することによって、大きなランダムの数列にする手法です。算術的な乱数列よりも良い乱数列が作れるみたいです。
お礼
丁寧な御回答ありがとうございます。 さっそく試してみたいと思います。