fork download
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <random>
  4. #include <cmath>
  5.  
  6. using namespace std;
  7.  
  8. // Funkcja podcałkowa do metod całkowych
  9. long double f(long double x) {
  10. return 4.0L / (1.0L + x * x);
  11. }
  12.  
  13. // ===============================
  14. // Metoda Monte Carlo
  15. // ===============================
  16. long double monteCarloPi(unsigned long long points) {
  17. mt19937_64 gen(random_device{}());
  18. uniform_real_distribution<long double> dist(0.0L, 1.0L);
  19.  
  20. unsigned long long inside = 0;
  21.  
  22. for (unsigned long long i = 0; i < points; ++i) {
  23. long double x = dist(gen);
  24. long double y = dist(gen);
  25.  
  26. if (x * x + y * y <= 1.0L)
  27. ++inside;
  28. }
  29.  
  30. return 4.0L * inside / points;
  31. }
  32.  
  33. // ===============================
  34. // Metoda prostokątów (lewych)
  35. // ===============================
  36. long double rectangleMethod(unsigned long long n) {
  37. long double h = 1.0L / n;
  38. long double sum = 0.0L;
  39.  
  40. for (unsigned long long i = 0; i < n; ++i) {
  41. long double x = i * h;
  42. sum += f(x);
  43. }
  44.  
  45. return h * sum;
  46. }
  47.  
  48. // ===============================
  49. // Metoda trapezów
  50. // ===============================
  51. long double trapezoidalMethod(unsigned long long n) {
  52. long double h = 1.0L / n;
  53. long double sum = (f(0.0L) + f(1.0L)) / 2.0L;
  54.  
  55. for (unsigned long long i = 1; i < n; ++i) {
  56. long double x = i * h;
  57. sum += f(x);
  58. }
  59.  
  60. return h * sum;
  61. }
  62.  
  63. // ===============================
  64. // MAIN
  65. // ===============================
  66. int main() {
  67.  
  68. const unsigned long long monteCarloPoints = 100000000ULL; // 100 000 000
  69. const unsigned long long intervals = 100000000ULL;
  70.  
  71. cout << fixed << setprecision(30);
  72.  
  73. long double piMonteCarlo = monteCarloPi(monteCarloPoints);
  74. long double piRectangle = rectangleMethod(intervals);
  75. long double piTrapezoid = trapezoidalMethod(intervals);
  76.  
  77. cout << "Monte Carlo (" << monteCarloPoints << " punktow):\n";
  78. cout << piMonteCarlo << "\n\n";
  79.  
  80. cout << "Metoda prostokatow:\n";
  81. cout << piRectangle << "\n\n";
  82.  
  83. cout << "Metoda trapezow:\n";
  84. cout << piTrapezoid << "\n";
  85.  
  86. return 0;
  87. }
Success #stdin #stdout 4.47s 5316KB
stdin
Standard input is empty
stdout
Monte Carlo (100000000 punktow):
3.141612000000000000030087043967

Metoda prostokatow:
3.141592663589793947955322583887

Metoda trapezow:
3.141592653589793948014710633920