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 n) {
  10. mt19937_64 gen(123456); // stałe ziarno dla powtarzalności
  11. uniform_real_distribution<long double> dist(-1.0L, 1.0L);
  12.  
  13. unsigned long long inside = 0;
  14.  
  15. for (unsigned long long i = 0; i < n; ++i) {
  16. long double x = dist(gen);
  17. long double y = dist(gen);
  18.  
  19. if (x * x + y * y <= 1.0L)
  20. inside++;
  21. }
  22.  
  23. return 4.0L * (long double)inside / (long double)n;
  24. }
  25.  
  26. // ================= METODA PROSTOKĄTÓW =================
  27. long double rectangleMethod(unsigned long long n) {
  28. long double h = 1.0L / (long double)n;
  29. long double sum = 0.0L;
  30.  
  31. for (unsigned long long i = 0; i < n; ++i) {
  32. long double x = i * h;
  33. sum += 1.0L / (1.0L + x * x);
  34. }
  35.  
  36. return 4.0L * h * sum;
  37. }
  38.  
  39. // ================= METODA TRAPEZÓW =================
  40. long double trapezoidalMethod(unsigned long long n) {
  41. long double h = 1.0L / (long double)n;
  42. long double sum = 0.0L;
  43.  
  44. sum += 0.5L * (1.0L / (1.0L + 0.0L * 0.0L));
  45. sum += 0.5L * (1.0L / (1.0L + 1.0L * 1.0L));
  46.  
  47. for (unsigned long long i = 1; i < n; ++i) {
  48. long double x = i * h;
  49. sum += 1.0L / (1.0L + x * x);
  50. }
  51.  
  52. return 4.0L * h * sum;
  53. }
  54.  
  55. // ================= MAIN =================
  56. int main() {
  57. unsigned long long nMonteCarlo = 100000000ULL; // 100 mln punktów
  58. unsigned long long nIntegral = 100000000ULL;
  59.  
  60. cout << fixed << setprecision(30);
  61.  
  62. long double piMonteCarlo = monteCarlo(nMonteCarlo);
  63. long double piRectangle = rectangleMethod(nIntegral);
  64. long double piTrapezoid = trapezoidalMethod(nIntegral);
  65.  
  66. cout << "Monte Carlo (100 000 000 punktów):\n";
  67. cout << piMonteCarlo << endl << endl;
  68.  
  69. cout << "Metoda prostokatow:\n";
  70. cout << piRectangle << endl << endl;
  71.  
  72. cout << "Metoda trapezow:\n";
  73. cout << piTrapezoid << endl;
  74.  
  75. return 0;
  76. }
Success #stdin #stdout 4.36s 5320KB
stdin
Standard input is empty
stdout
Monte Carlo (100 000 000 punktów):
3.141445999999999999898261937581

Metoda prostokatow:
3.141592663589793947955322583887

Metoda trapezow:
3.141592653589793948014710633920