fork download
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <random>
  4. #include <cmath>
  5.  
  6. using namespace std;
  7.  
  8. // ==========================
  9. // MONTE CARLO
  10. // ==========================
  11. long double monteCarloPi(unsigned long long n)
  12. {
  13. unsigned long long inside = 0;
  14.  
  15. random_device rd;
  16. mt19937_64 gen(rd());
  17. uniform_real_distribution<long double> dist(0.0L, 1.0L);
  18.  
  19. for (unsigned long long i = 0; i < n; ++i)
  20. {
  21. long double x = dist(gen);
  22. long double y = dist(gen);
  23.  
  24. if (x * x + y * y <= 1.0L)
  25. inside++;
  26. }
  27.  
  28. return 4.0L * (long double)inside / (long double)n;
  29. }
  30.  
  31. // ==========================
  32. // METODA PROSTOKĄTÓW
  33. // π = 4 ∫₀¹ 1/(1+x²) dx
  34. // ==========================
  35. long double rectanglePi(unsigned long long n)
  36. {
  37. long double sum = 0.0L;
  38. long double h = 1.0L / n;
  39.  
  40. for (unsigned long long i = 0; i < n; ++i)
  41. {
  42. long double x = i * h;
  43. sum += 1.0L / (1.0L + x * x);
  44. }
  45.  
  46. return 4.0L * h * sum;
  47. }
  48.  
  49. // ==========================
  50. // METODA TRAPEZÓW
  51. // ==========================
  52. long double trapezoidPi(unsigned long long n)
  53. {
  54. long double h = 1.0L / n;
  55. long double sum = 0.0L;
  56.  
  57. sum += 0.5L * (1.0L / (1.0L + 0.0L)); // f(0)
  58. sum += 0.5L * (1.0L / (1.0L + 1.0L)); // f(1)
  59.  
  60. for (unsigned long long i = 1; i < n; ++i)
  61. {
  62. long double x = i * h;
  63. sum += 1.0L / (1.0L + x * x);
  64. }
  65.  
  66. return 4.0L * h * sum;
  67. }
  68.  
  69. // ==========================
  70. // MAIN
  71. // ==========================
  72. int main()
  73. {
  74. unsigned long long n = 100000000; // liczba iteracji/podziałów
  75.  
  76. long double piMonte = monteCarloPi(n);
  77. long double piRect = rectanglePi(n);
  78. long double piTrap = trapezoidPi(n);
  79.  
  80. cout << fixed << setprecision(20);
  81.  
  82. cout << "Monte Carlo: " << piMonte << endl;
  83. cout << "Metoda prostokatow: " << piRect << endl;
  84. cout << "Metoda trapezow: " << piTrap << endl;
  85.  
  86. return 0;
  87. }
Success #stdin #stdout 4.41s 5312KB
stdin
Standard input is empty
stdout
Monte Carlo:      3.14145372000000000002
Metoda prostokatow: 3.14159266358979394796
Metoda trapezow:    3.14159265358979394801