fork download
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <random>
  4. #include <cmath>
  5.  
  6. using namespace std;
  7.  
  8. /* ===========================
  9.   MONTE CARLO
  10.   =========================== */
  11. long double monteCarlo(unsigned long long n) {
  12. mt19937_64 gen(123456); // stałe ziarno dla powtarzalności
  13. uniform_real_distribution<long double> dist(-1.0L, 1.0L);
  14.  
  15. unsigned long long inside = 0;
  16.  
  17. for (unsigned long long i = 0; i < n; ++i) {
  18. long double x = dist(gen);
  19. long double y = dist(gen);
  20.  
  21. if (x * x + y * y <= 1.0L)
  22. inside++;
  23. }
  24.  
  25. return 4.0L * inside / n;
  26. }
  27.  
  28. /* ===========================
  29.   METODA PROSTOKĄTÓW
  30.   π = 4 * ∫₀¹ 1/(1+x²) dx
  31.   =========================== */
  32. long double rectangles(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 += 1.0L / (1.0L + x * x);
  39. }
  40.  
  41. return 4.0L * h * sum;
  42. }
  43.  
  44. /* ===========================
  45.   METODA TRAPEZÓW
  46.   =========================== */
  47. long double trapezoids(unsigned long long n) {
  48. long double h = 1.0L / n;
  49. long double sum = 0.5L * (1.0L / (1.0L + 0.0L) +
  50. 1.0L / (1.0L + 1.0L));
  51.  
  52. for (unsigned long long i = 1; i < n; ++i) {
  53. long double x = i * h;
  54. sum += 1.0L / (1.0L + x * x);
  55. }
  56.  
  57. return 4.0L * h * sum;
  58. }
  59.  
  60. /* ===========================
  61.   MAIN
  62.   =========================== */
  63. int main() {
  64.  
  65. const unsigned long long n = 10000000ULL; // <<< TUTAJ ustawiasz dokładność
  66.  
  67. long double pi_mc = monteCarlo(n);
  68. long double pi_rect = rectangles(n);
  69. long double pi_trap = trapezoids(n);
  70.  
  71. cout << fixed << setprecision(20);
  72.  
  73. cout << "Monte Carlo: " << pi_mc << endl;
  74. cout << "Prostokaty: " << pi_rect << endl;
  75. cout << "Trapezy: " << pi_trap << endl;
  76.  
  77. return 0;
  78. }
Success #stdin #stdout 0.49s 5288KB
stdin
Standard input is empty
stdout
Monte Carlo:  3.14081960000000000007
Prostokaty:   3.14159275358979148888
Trapezy:      3.14159265358979148883