fork download
  1.  
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <random>
  5. #include <cmath>
  6.  
  7. using namespace std;
  8.  
  9. // Funkcja podcałkowa
  10. long double f(long double x) {
  11. return sqrt(1.0L - x * x);
  12. }
  13.  
  14. int main() {
  15.  
  16. // Tu ustawiasz liczbę losowań / podziałów
  17. const long long n = 1000000; // możesz zmienić np. na 10000000
  18.  
  19. cout << fixed << setprecision(20);
  20.  
  21. // =========================
  22. // 1. METODA MONTE CARLO
  23. // =========================
  24. mt19937_64 gen(123456); // stałe ziarno dla powtarzalnych wyników
  25. uniform_real_distribution<long double> dist(-1.0L, 1.0L);
  26.  
  27. long long inside = 0;
  28.  
  29. for (long long i = 0; i < n; i++) {
  30. long double x = dist(gen);
  31. long double y = dist(gen);
  32.  
  33. if (x * x + y * y <= 1.0L)
  34. inside++;
  35. }
  36.  
  37. long double pi_monte = 4.0L * inside / n;
  38.  
  39. // =========================
  40. // 2. METODA PROSTOKĄTÓW (punkty środkowe)
  41. // =========================
  42. long double h = 1.0L / n;
  43. long double sum_rect = 0.0L;
  44.  
  45. for (long long i = 0; i < n; i++) {
  46. long double x = (i + 0.5L) * h;
  47. sum_rect += f(x);
  48. }
  49.  
  50. long double pi_rect = 4.0L * h * sum_rect;
  51.  
  52. // =========================
  53. // 3. METODA TRAPEZÓW
  54. // =========================
  55. long double sum_trap = (f(0.0L) + f(1.0L)) / 2.0L;
  56.  
  57. for (long long i = 1; i < n; i++) {
  58. long double x = i * h;
  59. sum_trap += f(x);
  60. }
  61.  
  62. long double pi_trap = 4.0L * h * sum_trap;
  63.  
  64. // =========================
  65. // WYNIKI
  66. // =========================
  67. cout << "Przyblizenie liczby pi (n = " << n << "):\n\n";
  68. cout << "Monte Carlo : " << pi_monte << endl;
  69. cout << "Prostokaty : " << pi_rect << endl;
  70. cout << "Trapezy : " << pi_trap << endl;
  71.  
  72. return 0;
  73. }
Success #stdin #stdout 0.04s 5312KB
stdin
Standard input is empty
stdout
Przyblizenie liczby pi (n = 1000000):

Monte Carlo  : 3.14205599999999999998
Prostokaty   : 3.14159265393423042215
Trapezy      : 3.14159265241381118004