fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <time.h>
  5.  
  6. #define TRUE_AREA 0.5398 // 理論的な重複領域の面積(事前に計算された値)
  7. #define MAX_POINTS 100000 // 最大乱数の個数
  8.  
  9. // 点が円の中にあるかどうかを判定する関数
  10. int is_in_overlap(double x, double y) {
  11. double dist1 = (x - 0.5) * (x - 0.5) + y * y;
  12. double dist2 = (x - 0.5) * (x - 0.5) + (y - 1) * (y - 1);
  13. return (dist1 <= 0.25) && (dist2 <= 0.25);
  14. }
  15.  
  16. int main() {
  17. int i, count;
  18. double x, y;
  19. double estimated_area, error;
  20. int num_points[] = {1000, 5000, 10000, 50000, 100000}; // 乱数の個数
  21.  
  22. srand(time(NULL)); // 乱数の種を設定
  23.  
  24. // 各乱数の個数に対して推定面積と誤差を計算
  25. for (int j = 0; j < sizeof(num_points) / sizeof(num_points[0]); j++) {
  26. count = 0;
  27. for (i = 0; i < num_points[j]; i++) {
  28. x = (double)rand() / RAND_MAX;
  29. y = (double)rand() / RAND_MAX;
  30.  
  31. if (is_in_overlap(x, y)) {
  32. count++;
  33. }
  34. }
  35.  
  36. // 重複領域の面積の推定値
  37. estimated_area = 4.0 * (double)count / num_points[j];
  38.  
  39. // 真値との誤差
  40. error = fabs(estimated_area - TRUE_AREA);
  41.  
  42. // 結果を表示
  43. printf("乱数の個数: %d, 推定面積: %f, 誤差: %f\n", num_points[j], estimated_area, error);
  44. }
  45.  
  46. return 0;
  47. }
  48.  
Success #stdin #stdout 0.01s 5284KB
stdin
Standard input is empty
stdout
乱数の個数: 1000, 推定面積: 0.000000, 誤差: 0.539800
乱数の個数: 5000, 推定面積: 0.000000, 誤差: 0.539800
乱数の個数: 10000, 推定面積: 0.000000, 誤差: 0.539800
乱数の個数: 50000, 推定面積: 0.000000, 誤差: 0.539800
乱数の個数: 100000, 推定面積: 0.000000, 誤差: 0.539800