fork(1) download
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <random>
  4. #include <cmath>
  5.  
  6. using namespace std;
  7.  
  8. // liczba podziałów / losowań (MOŻESZ zmienić tutaj)
  9. const long long n = 10000000;
  10.  
  11. long double f(long double x) {
  12. return 4.0L / (1.0L + x * x);
  13. }
  14.  
  15. int main() {
  16.  
  17. // ================= MONTE CARLO =================
  18. mt19937_64 gen(123456); // stałe ziarno – zawsze ten sam wynik
  19. uniform_real_distribution<long double> dist(-1.0L, 1.0L);
  20.  
  21. long long inside = 0;
  22.  
  23. for(long long i = 0; i < n; i++) {
  24. long double x = dist(gen);
  25. long double y = dist(gen);
  26.  
  27. if(x*x + y*y <= 1.0L)
  28. inside++;
  29. }
  30.  
  31. long double pi_monte_carlo = 4.0L * inside / (long double)n;
  32.  
  33. // ================= PROSTOKĄTY =================
  34. long double dx = 1.0L / (long double)n;
  35. long double sum_rect = 0.0L;
  36.  
  37. for(long long i = 0; i < n; i++) {
  38. long double x = i * dx;
  39. sum_rect += f(x);
  40. }
  41.  
  42. long double pi_rect = sum_rect * dx;
  43.  
  44. // ================= TRAPEZY =================
  45. long double sum_trap = (f(0.0L) + f(1.0L)) / 2.0L;
  46.  
  47. for(long long i = 1; i < n; i++) {
  48. long double x = i * dx;
  49. sum_trap += f(x);
  50. }
  51.  
  52. long double pi_trap = sum_trap * dx;
  53.  
  54. // ================= WYNIKI =================
  55. cout << fixed << setprecision(20);
  56. cout << "Przyblizenie liczby pi:\n";
  57. cout << "Monte Carlo : " << pi_monte_carlo << endl;
  58. cout << "Prostokaty : " << pi_rect << endl;
  59. cout << "Trapezy : " << pi_trap << endl;
  60.  
  61. return 0;
  62. }
Success #stdin #stdout 0.45s 5320KB
stdin
Standard input is empty
stdout
Przyblizenie liczby pi:
Monte Carlo : 3.14081960000000000007
Prostokaty  : 3.14159275358979148888
Trapezy     : 3.14159265358979148883