ID非公開さん
2022/5/21 10:52
2回答
n個の点(x, y)を乱数で生成させ,モンテカルロ法により円周率を近似 せよ.nの値は100,10000,1000000の場合を出力すること.また,点 の座標は構造体にし,
n個の点(x, y)を乱数で生成させ,モンテカルロ法により円周率を近似 せよ.nの値は100,10000,1000000の場合を出力すること.また,点 の座標は構造体にし, 円周率の計算は関数MonteCarlomethodを作っ て行うこと.円周率の出力は小数点5位まで表示すること. 点の座標は0~1の範囲(double)にすること. (double)rand() / RAND_MAX; で乱数を生成できる. 誰か優しい方教えてください。 全然わかんなくて困っています。 プログラムだけで大丈夫です。
C言語関連・114閲覧
ベストアンサー
(1150911677さん) 例: #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 10000000 typedef struct { double x; double y; } XY; double my_random( void ) { return (double)rand() / RAND_MAX; } XY *makeData(int n) { XY *p; int i; p=(XY*)malloc(sizeof(XY)*n); for(i=0; i<n; i++) { p[i].x = my_random(); p[i].y = my_random(); //printf("(%f, %f)\n") } return p; } double MonteCarlomethod(XY *d, int n) { int i, cnt=0; for(i=0; i<n; i++) if((d[i].x * d[i].x + d[i].y * d[i].y)<=1.0)cnt++; return (double)cnt / n * 4.0; } void ope(int n) { XY *dt; double ret; dt=makeData(n); ret=MonteCarlomethod(dt,n); printf("n=(%7d) pi = %.5f\n",n,ret); free(dt); } int main(void) { srand((unsigned)time(NULL)); rand(); ope(100); ope(10000); ope(1000000); return 0; } ~~~~~~~~~~~~~~~~~~~~~~ n=( 100) pi = 3.24000 n=( 10000) pi = 3.13920 n=(1000000) pi = 3.14105 n=( 100) pi = 3.60000 n=( 10000) pi = 3.11720 n=(1000000) pi = 3.13969 n=( 100) pi = 3.28000 n=( 10000) pi = 3.12760 n=(1000000) pi = 3.14072
質問者からのお礼コメント
ありがとうございます!!
お礼日時:5/22 19:51