fork download
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <cmath>
  4.  
  5. using namespace std;
  6.  
  7. int main()
  8. {
  9. ios::sync_with_stdio(false);
  10. cin.tie(nullptr);
  11.  
  12. const long long N = 1000000; // 1 milion punktów
  13.  
  14. // ===== Monte Carlo =====
  15. unsigned long long seed = 123456789ULL;
  16. auto fastRand = [&seed]() {
  17. seed = seed * 2862933555777941757ULL + 3037000493ULL;
  18. return (seed >> 33) * (1.0 / (1ULL << 31));
  19. };
  20.  
  21. long long inside = 0;
  22.  
  23. // ===== Całkowanie =====
  24. double h = 1.0 / N;
  25. double sumRect = 0.0;
  26. double sumTrap = 0.0;
  27.  
  28. sumTrap = 0.5 * (1.0 + 1.0 / (1.0 + 1.0));
  29.  
  30. for(long long i = 0; i < N; i++)
  31. {
  32. // Monte Carlo
  33. double x = fastRand() * 2.0 - 1.0;
  34. double y = fastRand() * 2.0 - 1.0;
  35. if (x*x + y*y <= 1.0)
  36. inside++;
  37.  
  38. // Prostokąty (midpoint)
  39. double xr = (i + 0.5) * h;
  40. sumRect += 1.0 / (1.0 + xr*xr);
  41.  
  42. // Trapezy
  43. if (i > 0)
  44. {
  45. double xt = i * h;
  46. sumTrap += 1.0 / (1.0 + xt*xt);
  47. }
  48. }
  49.  
  50. double piMonte = 4.0 * inside / N;
  51. double piRect = 4.0 * h * sumRect;
  52. double piTrap = 4.0 * h * sumTrap;
  53.  
  54. cout << fixed << setprecision(20);
  55. cout << piMonte << "\n";
  56. cout << piRect << "\n";
  57. cout << piTrap << "\n";
  58.  
  59. return 0;
  60. }
Success #stdin #stdout 0.02s 5324KB
stdin
Standard input is empty
stdout
3.14483999999999985775
3.14159265358976425020
3.14159265358979267191