fork download
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <random>
  4. #include <cmath>
  5.  
  6. using namespace std;
  7.  
  8. // Funkcja do obliczania pi metodą Monte Carlo
  9. long double monteCarloPi(long long n) {
  10. random_device rd;
  11. mt19937_64 gen(rd());
  12. uniform_real_distribution<long double> dist(-1.0L, 1.0L);
  13.  
  14. long long inside = 0;
  15.  
  16. for (long long i = 0; i < n; i++) {
  17. long double x = dist(gen);
  18. long double y = dist(gen);
  19.  
  20. if (x * x + y * y <= 1.0L)
  21. inside++;
  22. }
  23.  
  24. return 4.0L * inside / n;
  25. }
  26.  
  27. // Funkcja f(x) = 4/(1+x^2)
  28. long double f(long double x) {
  29. return 4.0L / (1.0L + x * x);
  30. }
  31.  
  32. // Metoda prostokątów
  33. long double rectangleMethod(long long n) {
  34. long double h = 1.0L / n;
  35. long double sum = 0.0L;
  36.  
  37. for (long long i = 0; i < n; i++) {
  38. long double x = (i + 0.5L) * h; // środek przedziału
  39. sum += f(x);
  40. }
  41.  
  42. return sum * h;
  43. }
  44.  
  45. // Metoda trapezów
  46. long double trapezoidalMethod(long long n) {
  47. long double h = 1.0L / n;
  48. long double sum = (f(0.0L) + f(1.0L)) / 2.0L;
  49.  
  50. for (long long i = 1; i < n; i++) {
  51. long double x = i * h;
  52. sum += f(x);
  53. }
  54.  
  55. return sum * h;
  56. }
  57.  
  58. int main() {
  59. const long long n = 1000000;
  60.  
  61. cout << fixed << setprecision(20);
  62.  
  63. long double piMonteCarlo = monteCarloPi(n);
  64. long double piRectangle = rectangleMethod(n);
  65. long double piTrapezoid = trapezoidalMethod(n);
  66.  
  67. cout << "Liczba punktów (Monte Carlo): " << n << endl;
  68. cout << "Pi (Monte Carlo): " << piMonteCarlo << endl;
  69. cout << "Pi (Prostokaty): " << piRectangle << endl;
  70. cout << "Pi (Trapezy): " << piTrapezoid << endl;
  71.  
  72. return 0;
  73. }
Success #stdin #stdout 0.05s 5320KB
stdin
Standard input is empty
stdout
Liczba punktów (Monte Carlo): 1000000
Pi (Monte Carlo):      3.14089599999999999997
Pi (Prostokaty):       3.14159265358987658243
Pi (Trapezy):          3.14159265358962659187