ID非公開

2022/5/21 10:52

22回答

n個の点(x, y)を乱数で生成させ,モンテカルロ法により円周率を近似 せよ.nの値は100,10000,1000000の場合を出力すること.また,点 の座標は構造体にし,

C言語関連114閲覧

ベストアンサー

0

ThanksImg質問者からのお礼コメント

ありがとうございます!!

お礼日時:5/22 19:51

その他の回答(1件)

0

#include <stdio.h> #include <stdlib.h> #include <time.h> // 点 の座標は構造体 typedef struct {     double x;     double y; } POINT; double MonteCarlomethod(int, POINT[]); int main(void) {     POINT *p;     // nの値は100,10000,1000000     int pat[] = {100, 10000, 1000000};     int i, j;     double r;     srand((unsigned)time(NULL));     for (i = 0; i < sizeof(pat) / sizeof(int); i++) {         p = (POINT *)malloc(sizeof(POINT) * pat[i]);         // n個の点(x, y)を乱数で生成させる         for (j = 0; j < pat[i]; j++) {             // 点の座標は0~1の範囲(double)にすること.              // (double)rand() / RAND_MAX;で乱数を生成できる.             p[j].x = (double)rand() / RAND_MAX;             p[j].y = (double)rand() / RAND_MAX;         }         printf("%d times\n", pat[i]);         r = MonteCarlomethod(pat[i], p);         // 円周率の出力は小数点5位まで表示         printf("π ≒ %.5f\n", r);         free(p);     }     return 0; } // 円周率の計算は関数MonteCarlomethodを作っ て行う double MonteCarlomethod(int n, POINT a[]) {     int c = 0, i;     double r;     for (i = 0; i < n; i++) {         r = a[i].x * a[i].x + a[i].y * a[i].y;         if (r <= 1) {             c++;         }     }     return (double)c / n * 4; } ー 実行結果 ー 100 times π ≒ 2.96000 10000 times π ≒ 3.14680 1000000 times π ≒ 3.14320 100 times π ≒ 3.12000 10000 times π ≒ 3.13160 1000000 times π ≒ 3.14120 100 times π ≒ 3.24000 10000 times π ≒ 3.13000 1000000 times π ≒ 3.14090 100 times π ≒ 3.32000 10000 times π ≒ 3.12640 1000000 times π ≒ 3.14382