- ベストアンサー
セルフテストモンテカルロ法のプログラム
今、モンテカルロ法の勉強をしており、いろいろ調べていったらセルフテストモンテカルロ法というものがありました。文献をいろいろ読み、原理はなんとなくわかったのですが、C言語でのプログラミングをどのようにすればよいのか思い付きません。一例で良いのでわかる方、御回答をよろしくお願い致します。
- shoutantan
- お礼率50% (2/4)
- C・C++・C#
- 回答数4
- ありがとう数4
- みんなの回答 (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)
セルフテストモンテカルロ法の原理はどのようなものなのでしょうか?それを説明していただけると、良い回答が得られると思います。
補足
早速のお返事ありがとうございます。 私もまだ勉強中の身なので、あまり詳しくはお答えできませんが、わかっている範囲でお答えします。 まず、ランダムが保証されている数列(円周率 π など)をいくつかに区切って、それの写像をとり再利用することによって、大きなランダムの数列にする手法です。算術的な乱数列よりも良い乱数列が作れるみたいです。
関連するQ&A
- モンテカルロ法 円周率
モンテカルロ法で円周率を求めたいのですが C++でプログラムを実行までは出来るんですけど それをグラフにする方法が分かりません。 (扇形みたいなヤツです。点々が沢山付くヤツです。) あと「モンテカルロ法から演習路津が求まる原理」と 「エクセルとCプログラミングで円周率を求めた時の 比較の仕方」も教えて頂きたいのです…。 沢山聞いてしまって、本当にすいません。 なにとぞ、初心者なのでよろしくお願いします。
- ベストアンサー
- C・C++・C#
- 数値積分 モンテカルロ法を用いて
次の問題をモンテカルロ法を用いたC言語のプログラムを教えてください。 積分区間[0,10] ∫x^3+x^2-2x+10dx です お願いします。
- 締切済み
- C・C++・C#
- 凖モンテカルロ法 or モンテカルロ + MT
3次元に広がる物理量を面積分する方法について検討中です。 凖モンテカルロという方法でLDSという数列を用いて計算をすると、積分計算の 誤差の軽減が速まるらしいということがわかりました。原理はまだ勉強中ですが、 対象の空間を区切って、それぞれの細空間に乱数のポイントを配置することが いい方向に働くように見られます。 これに対して、通常のモンテカルロ法でメルセンヌツイスター(MT)を用いた場合との 違いがいまいちわかりません。MTで一様乱数ができるのであれば、凖モンテカルロ のようにする必要はないのでしょうか?
- ベストアンサー
- 数学・算数
- モンテカルロ法ベースのオセロプログラムを作りたいのですが
今、C言語でモンテカルロ法ベースのオセロプログラムを作っているのですが、なかなかうまくいきません。 エラー内容: ある程度書いてみたのですが、実行すると「Segmentation fault」とでてしまいます。 アルゴリズム内容: 構造体を用意して、ランダムに手を打ち勝ったら手の内容と勝ち数をカウントして、構造体に格納します。最後に一番勝ったてを指すというプログラムを書いています。 質問点: 「Segmentation fault」とでてしまいます。何故なのでしょうか? 解決方法と理由を教えてください。 プログラム内で他にも変な場所があれば、教えてください。 それと、モンテカルロ法だけだと弱いので、何かいい手はないでしょうか? 質問が多くて申し訳ございませんが、教えていただければ幸いです。 オセロのプログラムデータは添付しています。 開発環境のOSはubuntuを使用しています。Windowsの時、文字化けする可能性があります。 なにとぞよろしくお願いします。
- 締切済み
- C・C++・C#
- モンテカルロシミュレーションのプログラムについて
モンテカルロシミュレーションを用いたタンパク質と低分子の結合実験を行えるプログラム(使用言語:FORTRAN77)を作ろうと考えています。 結合実験の目的はタンパク質上で低分子が結合しやすい部分をさがすことです。 タンパク質上のそれぞれの部分に乱数を振り分けて確率的な試行(低分子をタンパク質に結合させる操作)を何回も繰り返すことで結合しやすい部分を見つけ出そうと考えています。 しかしプログラミングを本格的に始めてまもないということもあり、プログラムを作るための糸口がいま一つ見つかりません。 (例えばタンパク質上の各部分での乱数のふりかた、パソコンによる操作でタンパク質と低分子を結合できるようなプログラムの書き方など) プログラム完成にいたるまでの手順、方法等についてのアドバイスを頂けませんか?
- 締切済み
- 化学
- 何かプログラムを作りたいのですが…
はじめまして。プログラミングを猛(?)勉強中の中一です。 ところで、今、Cを勉強してるんですが、そろそろおおずめをむかえてきたので、本に載ってるようなプログラムでは我慢できなくて、もっと大きなプログラムを作りたいという衝動がおさえきれなくなってきました。 ですが、どうやって作ればいいのかわかりません。 はじめに作りたいものは、テキストエディタなんですが、はじめは「メモ帳」レベルからはじめて、高機能なものにしていきたいとおもっています。 なので、どうやってつくればいいかを詳しく教えていただけるとうれしいです(参考になるサイトでも結構です)。 また、言語はC/C++じゃなくてもいいです(勉強しますから)。 どうかご回答をよろしくおねがいします。
- ベストアンサー
- C・C++・C#
- 初めて自分で作ったプログラムは?
現在C言語を勉強しているものです。 これからほかの言語も勉強していくつもりです。 C言語はプログラミングの基本だと思ってます。 最終的に物理的シミュレーションやCGゲームを作ろうと考えています。 そこで質問です。 (1) 皆さんが初めて勉強したプログラミング言語は何ですか。? (2) その言語を使って初めて自分で考えて作ったプログラムは何でしたか? その時の心境とかできた後の感想とかも教えていただけると嬉しいです。 (うれしかった、がっかりした、等々)
- 締切済み
- C・C++・C#
お礼
丁寧な御回答ありがとうございます。 さっそく試してみたいと思います。