fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. #define TRUE 1
  6. #define FALSE 0
  7.  
  8. int main() {
  9. double a, b, s, shinchi;
  10. int count, m, n;
  11.  
  12. // 真の面積の値 (4つの単位円で囲まれた部分)
  13. shinchi = M_PI - 2.0;
  14.  
  15. // 試行回数nの増加
  16. for (n = 10; n < 100000; n = n * 5) {
  17. count = 0;
  18. s = 0.0;
  19.  
  20. // n回の試行
  21. for (m = 0; m < n; m++) {
  22. int inside = TRUE; // すべての条件を満たしたかどうかのフラグ
  23.  
  24. // 12個の乱数を生成して判定
  25. int i; // ループカウンタの変数をここで宣言
  26. for (i = 0; i < 12; i++) {
  27. a = (double)rand() / RAND_MAX;
  28. b = (double)rand() / RAND_MAX;
  29.  
  30. // 点 (a, b) がいずれかの円の外ならフラグを下げる
  31. if (!((a * a + b * b <= 1.0) &&
  32. ((a - 1) * (a - 1) + b * b <= 1.0) &&
  33. (a * a + (b - 1) * (b - 1) <= 1.0) &&
  34. ((a - 1) * (a - 1) + (b - 1) * (b - 1) <= 1.0))) {
  35. inside = FALSE;
  36. break; // 一つでも条件を満たさなければ終了
  37. }
  38. }
  39.  
  40. if (inside) s += 1.0; // 12個の乱数全てが条件を満たした場合のみカウント
  41. count++;
  42. }
  43.  
  44. // 面積の推定値
  45. s /= count;
  46.  
  47. // 誤差の出力
  48. printf("%d\t%f\n", n, fabs(s - shinchi));
  49. }
  50.  
  51. return 0;
  52. }
  53.  
Success #stdin #stdout 0.01s 5260KB
stdin
Standard input is empty
stdout
10	1.141593
50	1.141593
250	1.141593
1250	1.141593
6250	1.141593
31250	1.141593