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. if (x * x + y * y <= 1.0L)
  20. inside++;
  21. }
  22.  
  23. return 4.0L * inside / n;
  24. }
  25.  
  26. // Funkcja f(x) = sqrt(1 - x^2)
  27. long double f(long double x) {
  28. return sqrtl(1.0L - x * x);
  29. }
  30.  
  31. // Metoda prostokątów
  32. long double rectangleMethod(long long n) {
  33. long double a = 0.0L;
  34. long double b = 1.0L;
  35. long double h = (b - a) / n;
  36. long double sum = 0.0L;
  37.  
  38. for (long long i = 0; i < n; ++i) {
  39. long double x = a + i * h;
  40. sum += f(x);
  41. }
  42.  
  43. return 4.0L * h * sum;
  44. }
  45.  
  46. // Metoda trapezów
  47. long double trapezoidalMethod(long long n) {
  48. long double a = 0.0L;
  49. long double b = 1.0L;
  50. long double h = (b - a) / n;
  51. long double sum = (f(a) + f(b)) / 2.0L;
  52.  
  53. for (long long i = 1; i < n; ++i) {
  54. long double x = a + i * h;
  55. sum += f(x);
  56. }
  57.  
  58. return 4.0L * h * sum;
  59. }
  60.  
  61. int main() {
  62. const long long monteCarloPoints = 1000000; // zgodnie ze specyfikacją
  63. const long long n = 1000000; // liczba podziałów dla całkowania
  64.  
  65. cout << fixed << setprecision(20);
  66.  
  67. long double piMonteCarlo = monteCarloPi(monteCarloPoints);
  68. long double piRectangle = rectangleMethod(n);
  69. long double piTrapezoid = trapezoidalMethod(n);
  70.  
  71. cout << "Metoda Monte Carlo (" << monteCarloPoints << " punktow):\n";
  72. cout << "pi = " << piMonteCarlo << endl << endl;
  73.  
  74. cout << "Metoda prostokatow:\n";
  75. cout << "pi = " << piRectangle << endl << endl;
  76.  
  77. cout << "Metoda trapezow:\n";
  78. cout << "pi = " << piTrapezoid << endl;
  79.  
  80. return 0;
  81. }
Success #stdin #stdout 0.05s 5320KB
stdin
Standard input is empty
stdout
Metoda Monte Carlo (1000000 punktow):
pi = 3.14302400000000000009

Metoda prostokatow:
pi = 3.14159465241381118008

Metoda trapezow:
pi = 3.14159265241381118004