« 海外出張 | トップページ | そんなのありですか? »

「Googleかっ」の続き

先日紹介したアルモニコスのプレテストをプログラムで解いてみました。

アルゴリズムはモンテカルロ法です。

乱数で-2.5~2.5までの小数を3つ発生させてそれを直交座標系のXYZの各座標の値と扱います。そのうち、問題の立体内にある点の数を数えて、全体のうちの何割が立体内に存在するかを計算します。最後に1辺が5の立方体の体積にその割合をかけて、求める立体の体積とします。

そんな計算をするプログラムとして次のソースを書きました。

#include <stdlib.h>
#include
<iostream>
#include
<math.h>
#include
<time.h>

int main(int argc,char* argv[]){
  double point[3];
  const int LOOP_MAX=100000;
  int in=0;
  srand((unsigned)time(NULL));
  for(int i=0;i<LOOP_MAX;i++){
    for(int j=0;j<3;j++)
      point[j]=5.0*rand()/RAND_MAX-2.5;
      double l=sqrt(2.5*2.5-point[2]*point[2]);
    if(fabs(point[0])<=l && fabs(point[1])<=l)
      in++;
  }
  std::cout << "Answer=" << pow(5.0,3)*in/LOOP_MAX << std::endl;
}

結果は83.5275(乱数を使っているので実行するたびに変化します。) だいたい250/3なのでアルモニコスの答えは数字は合っているようです。

|

« 海外出張 | トップページ | そんなのありですか? »

日記・コラム・つぶやき」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/535686/27494730

この記事へのトラックバック一覧です: 「Googleかっ」の続き:

« 海外出張 | トップページ | そんなのありですか? »