C言語関係掲示板

過去ログ

No.46. 半径1の球の体積(モンテカルロ法)


九九の表のヒントを下さり、本当にどうもありがとうございました!
じつはもう1つ宿題がありまして、それも教えて下さい。

「以下のプログラムを修正して、半径1の球の体積(3次元)を求めるプログラムを作りなさい。」
#include <stdio.h>
#include <stdlib.h>
#define LAMBDA 843314861L
#define RANCONST 453816693L
#define RANDOM_INIT_VALUE 198313L
#define RAN2_32 4294967296.0
#define LOOPCOUNT 10000
#define LOOPSTEP 1000
main(){
  int i, CircleCount=0;
  float x, y, rand (void);
  for (i=1; i<=LOOPCOUNT; i++) {
   x = rand (); y = rand ();
   if (x*x + y*y <= 1.0)
     CircleCount++;
   if (i % LOOPSTEP == 0)
     printf("%7d 回 pi=%f\n",
         i, 4.0*CircleCount/(float)i);}
}


お願いしますm(..)m


>「以下のプログラムを修正して、半径1の球の体積(3次元)を求めるプログラムを作りなさい。」

条件って、これだけですか?

>#define LAMBDA 843314861L
>#define RANCONST 453816693L
>#define RANDOM_INIT_VALUE 198313L
>#define RAN2_32 4294967296.0

最初の方のdefineって、何に使うんでしょう。


>>「以下のプログラムを修正して、半径1の球の体積(3次元)を求めるプログラムを作りなさい。」
>
>条件って、これだけですか?

・モンテカルロシュミレーションによって値を予測します。
・さっきのプログラムを3次元に拡張します。
 x*x + y*y + z*z < 1
・このrand()は、0から、RAND_MAXまでの範囲の整数型の疑似乱数を返しますので、0から1までの乱数にするには、x = rand()/(float)RAND_MAX;などとします。

・・・・と補足がありました。自分にはちんぷんかんぷんです。

分かりますでしょうか?


モンテカルロ法については、
http://www.nikonet.or.jp/spring/sanae/MathTopic/montecalro/montecalro.htm
http://golf.sci.ibaraki.ac.jp/~yoshida/chap5.pdf
が詳しいですね。

この問題、先生のヒント通りですよ。

#include <stdio.h>
#include <stdlib.h>

#define LOOPCOUNT 10000
#define LOOPSTEP 1000

main(){
        int i, CircleCount=0;
        float x, y;
        for (i=1; i<=LOOPCOUNT; i++) {
                x = rand()/(float)RAND_MAX;
                y = rand()/(float)RAND_MAX;
                if (x*x + y*y <= 1.0)
                        CircleCount++;
                if (i % LOOPSTEP == 0)
                        printf("%7d 回 pi=%f\n",
                                i, 4.0*CircleCount/(float)i);
        }
}


で、?の値が求められますから、これに  + z*z を加えて、
2の2乗の4.0の代わりに、2の3乗の8.0を掛けて答えを求めればいいのではないでしょうか。


ともじさん、どうもありがとうございました!
今日、学校のPCで実践してみます。

戻る


「初心者のためのポイント学習C言語」 Last modified:2001.10.5
Copyright(c) 2000-2002 TOMOJI All Rights Reserved