fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #define M_PI 3.14159265
  5.  
  6. int main() {
  7. double a, b, s, x1, x2, y1, y2;
  8. double r, q1, q2, shinchi;
  9. int count, m, n;
  10.  
  11. // 理論的な重複領域の面積
  12. shinchi = M_PI / 2.0 - 1.0;
  13.  
  14. // 円の中心と半径の設定
  15. x1 = 1.0; y1 = 0.0;
  16. x2 = 0.0; y2 = 1.0;
  17. r = 1.0;
  18.  
  19. // 各乱数の個数についてモンテカルロ法を実行
  20. for (n = 10; n <= 100000; n = n * 5) {
  21. count = 0;
  22. s = 0.0;
  23. for (m = 0; m < n; m++) {
  24. a = (double)rand() / RAND_MAX;
  25. b = (double)rand() / RAND_MAX;
  26. q1 = (a - x1) * (a - x1) + (b - y1) * (b - y1);
  27. q2 = (a - x2) * (a - x2) + (b - y2) * (b - y2);
  28. if (q1 < r * r && q2 < r * r) {
  29. s += 1.0;
  30. }
  31. count++;
  32. }
  33. s = s / count;
  34. s = s * 4; // 単位正方形内の割合から全体の面積に換算
  35. printf("乱数の個数: %d, 誤差: %f\n", n, fabs(s - shinchi));
  36. }
  37.  
  38. return 0;
  39. }
  40.  
Success #stdin #stdout 0.01s 5288KB
stdin
Standard input is empty
stdout
乱数の個数: 10, 誤差: 1.829204
乱数の個数: 50, 誤差: 1.429204
乱数の個数: 250, 誤差: 1.989204
乱数の個数: 1250, 誤差: 1.742804
乱数の個数: 6250, 誤差: 1.709524
乱数の個数: 31250, 誤差: 1.713876