fork download
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <random>
  4. #include <cmath>
  5.  
  6. using namespace std;
  7.  
  8. // Stała liczba losowań / podziałów
  9. const unsigned long long N = 100000000ULL;
  10.  
  11. // Funkcja podcałkowa
  12. long double f(long double x) {
  13. return 4.0L / (1.0L + x * x);
  14. }
  15.  
  16. // ====================== MONTE CARLO ======================
  17. long double monteCarlo(unsigned long long &inside) {
  18. mt19937_64 gen(random_device{}());
  19. uniform_real_distribution<long double> dist(-1.0L, 1.0L);
  20.  
  21. inside = 0;
  22.  
  23. for (unsigned 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. return 4.0L * inside / N;
  32. }
  33.  
  34. // ====================== METODA PROSTOKĄTÓW ======================
  35. long double rectangles() {
  36. long double h = 1.0L / N;
  37. long double sum = 0.0L;
  38.  
  39. for (unsigned long long i = 0; i < N; ++i) {
  40. long double x = i * h;
  41. sum += f(x);
  42. }
  43.  
  44. return h * sum;
  45. }
  46.  
  47. // ====================== METODA TRAPEZÓW ======================
  48. long double trapezoids() {
  49. long double h = 1.0L / N;
  50. long double sum = (f(0.0L) + f(1.0L)) / 2.0L;
  51.  
  52. for (unsigned long long i = 1; i < N; ++i) {
  53. long double x = i * h;
  54. sum += f(x);
  55. }
  56.  
  57. return h * sum;
  58. }
  59.  
  60. // ====================== MAIN ======================
  61. int main() {
  62.  
  63. cout << fixed << setprecision(30);
  64.  
  65. // Monte Carlo
  66. unsigned long long inside;
  67. long double pi_monte = monteCarlo(inside);
  68.  
  69. cout << "--- Metoda Monte Carlo ---\n";
  70. cout << "Liczba punktow w kole: " << inside << endl;
  71. cout << "Przyblizenie pi: " << pi_monte << endl;
  72.  
  73. // Prostokąty
  74. long double pi_rect = rectangles();
  75. cout << "\n--- Metoda prostokatow ---\n";
  76. cout << "Przyblizenie pi: " << pi_rect << endl;
  77.  
  78. // Trapezy
  79. long double pi_trap = trapezoids();
  80. cout << "\n--- Metoda trapezow ---\n";
  81. cout << "Przyblizenie pi: " << pi_trap << endl;
  82.  
  83. return 0;
  84. }
Success #stdin #stdout 4.67s 5320KB
stdin
Standard input is empty
stdout
--- Metoda Monte Carlo ---
Liczba punktow w kole: 78537716
Przyblizenie pi:       3.141508639999999999989702126335

--- Metoda prostokatow ---
Przyblizenie pi:       3.141592663589793947955322583887

--- Metoda trapezow ---
Przyblizenie pi:       3.141592653589793948014710633920