fork download
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <random>
  4. #include <cmath>
  5.  
  6. using namespace std;
  7.  
  8. // ===================== MONTE CARLO =====================
  9. long double monteCarlo(unsigned long long samples) {
  10. mt19937_64 gen(42); // stałe ziarno dla powtarzalności
  11. uniform_real_distribution<long double> dist(0.0L, 1.0L);
  12.  
  13. unsigned long long inside = 0;
  14.  
  15. for (unsigned long long i = 0; i < samples; i++) {
  16. long double x = dist(gen);
  17. long double y = dist(gen);
  18. if (x * x + y * y <= 1.0L)
  19. inside++;
  20. }
  21.  
  22. return 4.0L * inside / samples;
  23. }
  24.  
  25. // ===================== METODA PROSTOKĄTÓW =====================
  26. long double rectangleMethod(unsigned long long n) {
  27. long double h = 1.0L / n;
  28. long double sum = 0.0L;
  29.  
  30. for (unsigned long long i = 0; i < n; i++) {
  31. long double x = (i + 0.5L) * h; // środek przedziału
  32. sum += 4.0L / (1.0L + x * x);
  33. }
  34.  
  35. return sum * h;
  36. }
  37.  
  38. // ===================== METODA TRAPEZÓW =====================
  39. long double trapezoidalMethod(unsigned long long n) {
  40. long double h = 1.0L / n;
  41. long double sum = 0.5L * (4.0L / (1.0L + 0.0L) +
  42. 4.0L / (1.0L + 1.0L));
  43.  
  44. for (unsigned long long i = 1; i < n; i++) {
  45. long double x = i * h;
  46. sum += 4.0L / (1.0L + x * x);
  47. }
  48.  
  49. return sum * h;
  50. }
  51.  
  52. // ===================== MAIN =====================
  53. int main() {
  54. cout << fixed << setprecision(20);
  55.  
  56. // Liczby iteracji (można zwiększyć dla większej dokładności)
  57. unsigned long long monteSamples = 100000000; // 1e8
  58. unsigned long long integrationSteps = 10000000; // 1e7
  59.  
  60. long double piMonte = monteCarlo(monteSamples);
  61. long double piRect = rectangleMethod(integrationSteps);
  62. long double piTrap = trapezoidalMethod(integrationSteps);
  63.  
  64. cout << "Monte Carlo: " << piMonte << endl;
  65. cout << "Metoda prostokatow: " << piRect << endl;
  66. cout << "Metoda trapezow: " << piTrap << endl;
  67.  
  68. return 0;
  69. }
Success #stdin #stdout 3.42s 5316KB
stdin
Standard input is empty
stdout
Monte Carlo:       3.14145251999999999999
Metoda prostokatow: 3.14159265358979382095
Metoda trapezow:    3.14159265358979148883