モンテカルロ法

[戻る]
コタロー 2006/05/13(土) 08:55:48
モンテカルロ法を使ってπの近似値を求めるプログラムを教えて下さい。

・試行は20000回
・ある乱数Rが与えられたときにそれを使って新しい乱数を作り出す([0,1)間の一様乱数を発
生させる)プログラムを関数として作り、それを利用する。

というかたちにしたいのですが・・

分かる方、お願いします。

επιστημη 2006/05/13(土) 09:53:31
0. count = 0;
1. [0,1) で二つの乱数 x, yを生成する
2. 点(x,y)が半径1の円の内部ならcount = count+1;
3. 1,2を2000回繰り返す。
4. count/20000 は半径1の4分円の面積:Π/4 に近侍しているハズ

コタロー 2006/05/13(土) 12:46:01
お返事ありがとうございます。
流れは大体分かったのですがプログラムが組めません。

・乱数を関数からもってくるにはどういう戻り値にするか
・乱数をx、yにあてはめていくにはどうすればいいか

などを教えていただけるとうれしいです。
本当に初歩的な質問で申し訳ありません;

ITO 2006/05/13(土) 13:13:36
まず本を買ってみてください。
参考
http://www.amazon.co.jp/exec/obidos/search-handle-form/503-7666116-0127913

やはり、何事も基本を覚えてからじゃないと先へ進めない思います。

ITO 2006/05/13(土) 13:20:29
リンクをはれませんでした。
www.amazon.co.jpで「モンテカルロ法」を検索すると出てきます。

コタロー 2006/05/13(土) 13:23:19
ご紹介ありがとうございました。

基本を覚えるのはやはり大切だと思うので、本の購入も考えてみたいと思います。
しかし、このモンテカルロ法はできればはやく教えていただきたいので、どなたか分かる方がい
ればお願いしたいのですが・・

xyz 2006/05/13(土) 13:36:54
要するに宿題か何かで、しかも自分でやる気はない、ということだな

コタロー 2006/05/13(土) 13:40:55
宿題ですが、やってもできないんで教えていただきたいのです。
やはりだめでしょうか・・

ITO 2006/05/13(土) 13:44:27
>しかし、このモンテカルロ法はできればはやく教えていただきたいので、
そのためには、本を買って覚えましょう。
それが一番の近道です。

ITO 2006/05/13(土) 13:48:38
追伸、
僕は、「モンテカルロ法」は詳しくないのですが、
たとえ詳しい人が教えてもどうどうめぐりするだけだと思います。

tetrapod 2006/05/13(土) 14:15:59
[0, 1) を返す関数 drand48() が自作できたなら

for (int iter=0; iter<NNNNN; ++iter) {
  // (x,y) のペアを作成
  double x=drand48();
  double y=drand48();
  // それが円の内側であるかどうか判定
  if (x*x+y*y<1.0) ++n;
}
// あとは NNNNN と n の関係からπが求められる

kure 2006/05/13(土) 14:34:33
επιστημηさんの説明をもう少し判りやすくしてみます。

中心角が90度の第1象限に存在する扇形を考えます。
このとき扇形の面積は半径Rを用いてR^2Π/4となります。 (4

モンテカルロ法とは乱数によって値を近似する方法全般のことを指しますが、
この場合は乱数によって正方形の面積と扇形の面積の比を近似することで
Πの近似値を取得することが出来ます。
ここでは1辺2Rの正方形の面積S=4R^2に対して半径Rの円の面積S'=R^2πを用いると
S/S'=4/πになりπ=4S'/Sになるという関係を用います。

具体的には区間[0,1)の範囲の乱数x,y(x軸、y軸)を生成し (1
座標(x,y)が区間[0,1)に含まれるかどうかをカウントします。 (2
これを十分な回数(ここでは20000回)繰り返し、
20000回のうち、円に含まれる部分の数/20000が扇形の面積/正方形の面積(S'/S)に
近似することになります。 (3
これをπ=4S'/Sに適用することでπを求めることができます。

> ・乱数を関数からもってくるにはどういう戻り値にするか
> ・乱数をx、yにあてはめていくにはどうすればいいか

これはC/C++言語の基礎の関数についての質問であり、モンテカルロ法とは
なんの関係もありませんので、教科書や書籍を読んでください。

乱数を発生させる関数がわからないのであれば、
randという関数がstdlib.hに定義されていますので
それで十分であればそれを使ってみてください。

シャノン 2006/05/13(土) 15:11:40
宿題であれば「わかりませんでした」で済まされます。
答えだけ教えてもらって提出するより、素直にわからないと告白したほうが今後のため
でしょう。

コタロー 2006/05/13(土) 21:51:39
[[解決]]
ありがとうざいました。

宿題の質問は自分の為にならないと分かっていながらも、
どうしてもできなかったので質問させていただきました。

答えていただいた方、意見を述べていただいた方にお詫びとお礼を申し上げます。

アドバイスを参考に問題も無事解くことができました。
ほんとうにスイマセンでした;

古いスレッドには追加発言できません。