fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h> // M_PI を利用
  4.  
  5. #define NUM_RANDOM 12 // 各試行で使用する乱数のペア数
  6.  
  7. int main() {
  8. double a, b, s, shinchi;
  9. int count, n, i, trial, inside_count;
  10.  
  11. // 真の値(4つの単位円で囲まれた領域の理論値)
  12. shinchi = M_PI - 2.0;
  13.  
  14. // 試行ごとに乱数の個数を12に固定し、n回繰り返す
  15. for (n = 10; n < 100000; n = n * 5) {
  16. count = 0;
  17. s = 0.0;
  18.  
  19. for (trial = 0; trial < n; trial++) {
  20. inside_count = 0;
  21.  
  22. // 12個の乱数ペア (a, b) を生成して判定
  23. for (i = 0; i < NUM_RANDOM; i++) {
  24. a = (double)rand() / RAND_MAX; // 乱数aを生成
  25. b = (double)rand() / RAND_MAX; // 乱数bを生成
  26.  
  27. // 4つの円に含まれるか判定
  28. if ((a * a + b * b <= 1.0) && // (0, 0) を中心とする円
  29. ((a - 1) * (a - 1) + b * b <= 1.0) && // (1, 0) を中心とする円
  30. (a * a + (b - 1) * (b - 1) <= 1.0) && // (0, 1) を中心とする円
  31. ((a - 1) * (a - 1) + (b - 1) * (b - 1) <= 1.0)) { // (1, 1) を中心とする円
  32. inside_count++; // 円の中に入っている点をカウント
  33. }
  34. }
  35.  
  36. // 試行ごとの成功割合を計算
  37. s += (double)inside_count / NUM_RANDOM;
  38. count++;
  39. }
  40.  
  41. // 推定された面積の平均
  42. s /= count;
  43.  
  44. // 理論値との誤差を表示
  45. printf("%d\t%f\n", n, fabs(s - shinchi));
  46. }
  47.  
  48. return 0;
  49. }
  50.  
Success #stdin #stdout 0.02s 5272KB
stdin
Standard input is empty
stdout
10	0.833259
50	0.794926
250	0.832593
1250	0.824726
6250	0.822939
31250	0.826115