fork(1) download
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <random>
  4. #include <cmath>
  5.  
  6. using namespace std;
  7.  
  8. long double f(long double x) {
  9. return 4.0L / (1.0L + x * x);
  10. }
  11.  
  12. int main() {
  13.  
  14. // ===== USTAWIONA LICZBA ITERACJI =====
  15. const unsigned long long n = 1000000ULL;
  16.  
  17. // ======================
  18. // 1. MONTE CARLO
  19. // ======================
  20. mt19937_64 gen(123456); // stałe ziarno
  21. uniform_real_distribution<long double> dist(-1.0L, 1.0L);
  22.  
  23. unsigned long long inside = 0;
  24.  
  25. for (unsigned long long i = 0; i < n; i++) {
  26. long double x = dist(gen);
  27. long double y = dist(gen);
  28. if (x*x + y*y <= 1.0L)
  29. inside++;
  30. }
  31.  
  32. long double pi_monte = 4.0L * inside / n;
  33.  
  34. // ======================
  35. // 2. PROSTOKĄTY
  36. // ======================
  37. long double h = 1.0L / n;
  38. long double sum_rect = 0.0L;
  39.  
  40. for (unsigned long long i = 0; i < n; i++) {
  41. long double x = i * h;
  42. sum_rect += f(x);
  43. }
  44.  
  45. long double pi_rect = h * sum_rect;
  46.  
  47. // ======================
  48. // 3. TRAPEZY
  49. // ======================
  50. long double sum_trap = (f(0.0L) + f(1.0L)) / 2.0L;
  51.  
  52. for (unsigned long long i = 1; i < n; i++) {
  53. long double x = i * h;
  54. sum_trap += f(x);
  55. }
  56.  
  57. long double pi_trap = h * sum_trap;
  58.  
  59. // ======================
  60. // WYNIKI
  61. // ======================
  62. cout << fixed << setprecision(20);
  63. cout << "Monte Carlo : " << pi_monte << endl;
  64. cout << "Prostokaty : " << pi_rect << endl;
  65. cout << "Trapezy : " << pi_trap << endl;
  66.  
  67. return 0;
  68. }
Success #stdin #stdout 0.04s 5316KB
stdin
Standard input is empty
stdout
Monte Carlo : 3.14205599999999999998
Prostokaty  : 3.14159365358962659200
Trapezy     : 3.14159265358962659187