fork download
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <random>
  4. #include <cmath>
  5.  
  6. using namespace std;
  7.  
  8. // Funkcja podcałkowa
  9. long double f(long double x) {
  10. return 4.0L / (1.0L + x * x);
  11. }
  12.  
  13. // Metoda Monte Carlo
  14. long double monteCarloPi(unsigned long long points) {
  15. mt19937_64 gen(random_device{}());
  16. uniform_real_distribution<long double> dist(0.0L, 1.0L);
  17.  
  18. unsigned long long inside = 0;
  19.  
  20. for (unsigned long long i = 0; i < points; ++i) {
  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 * inside / points;
  29. }
  30.  
  31. // Metoda prostokątów (lewych)
  32. long double rectangleMethod(unsigned long long n) {
  33. long double h = 1.0L / n;
  34. long double sum = 0.0L;
  35.  
  36. for (unsigned long long i = 0; i < n; ++i) {
  37. long double x = i * h;
  38. sum += f(x);
  39. }
  40.  
  41. return h * sum;
  42. }
  43.  
  44. // Metoda trapezów
  45. long double trapezoidalMethod(unsigned long long n) {
  46. long double h = 1.0L / n;
  47. long double sum = (f(0.0L) + f(1.0L)) / 2.0L;
  48.  
  49. for (unsigned long long i = 1; i < n; ++i) {
  50. long double x = i * h;
  51. sum += f(x);
  52. }
  53.  
  54. return h * sum;
  55. }
  56.  
  57. int main() {
  58. // Liczba punktów/przedziałów
  59. unsigned long long monteCarloPoints = 100000000; // 1e8
  60. unsigned long long intervals = 100000000; // 1e8
  61.  
  62. cout << fixed << setprecision(20);
  63.  
  64. long double piMonteCarlo = monteCarloPi(monteCarloPoints);
  65. long double piRectangle = rectangleMethod(intervals);
  66. long double piTrapezoid = trapezoidalMethod(intervals);
  67.  
  68. cout << "Monte Carlo: " << piMonteCarlo << endl;
  69. cout << "Metoda prostokatow: " << piRectangle << endl;
  70. cout << "Metoda trapezow: " << piTrapezoid << endl;
  71.  
  72. return 0;
  73. }
Success #stdin #stdout 4.29s 5320KB
stdin
Standard input is empty
stdout
Monte Carlo:      3.14163996000000000008
Metoda prostokatow: 3.14159266358979394796
Metoda trapezow:    3.14159265358979394801