fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <time.h>
  5.  
  6. #define NUM_POINTS 1000000
  7. #define TRUE_AREA (M_PI - 3 * sqrt(3) + 3) / 3
  8. #define NUM_STEPS 12
  9.  
  10. // 4つの単位円の重複領域にあるかを判定する関数
  11. int is_inside(double x, double y) {
  12. double r = 1.0;
  13. if ((x - 0) * (x - 0) + (y - 1) * (y - 1) <= r * r && // 中心 (0, 1) の円
  14. (x - 1) * (x - 1) + (y - 0) * (y - 0) <= r * r && // 中心 (1, 0) の円
  15. (x - 0) * (x - 0) + (y - 0) * (y - 0) <= r * r && // 中心 (0, 0) の円
  16. (x - 1) * (x - 1) + (y - 1) * (y - 1) <= r * r) { // 中心 (1, 1) の円
  17. return 1;
  18. }
  19. return 0;
  20. }
  21.  
  22. int main() {
  23. int i, inside_count = 0;
  24. double x, y;
  25. double estimated_area;
  26. double error;
  27. int step_size = NUM_POINTS / NUM_STEPS; // 乱数の個数を12ステップに分割
  28.  
  29. srand(time(NULL));
  30.  
  31. printf("乱数の個数, 誤差\n");
  32.  
  33. for (i = 1; i <= NUM_POINTS; i++) {
  34. x = (double)rand() / RAND_MAX;
  35. y = (double)rand() / RAND_MAX;
  36.  
  37. if (is_inside(x, y)) {
  38. inside_count++;
  39. }
  40.  
  41. if (i % step_size == 0) {
  42. estimated_area = 4.0 * (double)inside_count / i;
  43. error = fabs(estimated_area - TRUE_AREA);
  44.  
  45. printf("%d,%f\n", i, error);
  46. }
  47. }
  48.  
  49. printf("計算が完了しました。\n");
  50.  
  51. return 0;
  52. }
  53.  
Success #stdin #stdout 0.03s 5284KB
stdin
Standard input is empty
stdout
乱数の個数, 誤差
83333,0.941258
166666,0.938234
249999,0.939754
333332,0.941450
416665,0.943255
499998,0.942354
583331,0.943967
666664,0.943658
749997,0.944149
833330,0.944863
916663,0.945007
999996,0.945866
計算が完了しました。