fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. #define M_PI 3.14159265
  6. #define NUM_RANDOM 12 // 乱数の個数を12に固定
  7.  
  8. int main() {
  9. double a[NUM_RANDOM], b[NUM_RANDOM], s, shinchi;
  10. int count, m, n, i;
  11.  
  12. // 真の値(4つの単位円で囲まれた領域)
  13. shinchi = M_PI - 2.0;
  14.  
  15. count = 0;
  16.  
  17. // nの範囲で乱数の試行回数を増やす
  18. for (n = 10; n < 100000; n = n * 5) {
  19. count = 0;
  20. s = 0.0;
  21.  
  22. for (m = 0; m < n; m++) {
  23. // 12個のランダムな点 (a[i], b[i]) を生成
  24. for (i = 0; i < NUM_RANDOM; i++) {
  25. a[i] = (double)rand() / RAND_MAX;
  26. b[i] = (double)rand() / RAND_MAX;
  27. }
  28.  
  29. // 12個の点が4つの円に含まれるかチェック
  30. for (i = 0; i < NUM_RANDOM; i++) {
  31. if ((a[i] * a[i] + b[i] * b[i] <= 1.0) && // (0, 0) を中心とする円
  32. ((a[i] - 1) * (a[i] - 1) + b[i] * b[i] <= 1.0) && // (1, 0) を中心とする円
  33. (a[i] * a[i] + (b[i] - 1) * (b[i] - 1) <= 1.0) && // (0, 1) を中心とする円
  34. ((a[i] - 1) * (a[i] - 1) + (b[i] - 1) * (b[i] - 1) <= 1.0)) { // (1, 1) を中心とする円
  35. s += 1.0;
  36. }
  37. }
  38. count += NUM_RANDOM; // 12個の点をカウント
  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.03s 5268KB
stdin
Standard input is empty
stdout
10	0.833259
50	0.794926
250	0.832593
1250	0.824726
6250	0.822939
31250	0.826115