Advertisement
Fisyuk

monte-carlo for pi

Nov 26th, 2014
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.47 KB | None | 0 0
  1. /* Вероятность того, что выбранная наугад точка внутри квадрата попадет внутрь окружности равна отношению площадей
  2. окружности и квадрата, то есть pi/4. Площадь квадрата накрывается сеткой из равноотстоящих точек (чем выше плотность
  3. точек, тем выше точность вычисления pi). Отношение точек, попавших внутрь окружности, к общему числу точек стремится
  4. (при увеличении общего количества точек к бесконечности) к вероятности попадания случайной точки внутри окружности,
  5. то есть pi/4. Если координаты точки x и y ( -1 < x < 1 и -1 < y < 1), то условие попадания точки внутрь окружности
  6. имеет вид ({x}^{2} + {y}^{2} < 1)
  7.  
  8. Суть расчета заключается в том, что мы берем квадрат со стороной a = 2 R, вписываем в него круг радиусом R. И начинаем
  9. наугад ставить точки внутри квадрата. Геометрически, вероятность P1 того, что точка попадет в круг, равна отношению площадей круга и квадрата:
  10. P1=Sкруг / Sквадрата = Pi*R2 / a 2 = Pi*R2 / (2 R ) 2= Pi*R2 / (2 R) 2 = Pi / 4 (1)
  11.  
  12. Вероятность попадания точки в круг можно также посчитать после численного эксперимента: посчитать количество точек, попавших в круг, и поделить
  13. их на общее количество поставленных точек:
  14. P2=Nпопавших в круг / Nточек; (2)
  15.  
  16. Так, при большом количестве точек в численном эксперименте вероятности должны вести себя cледующим образом:
  17. lim(Nточек→∞)/(P2-P1)=0; (3)
  18.  
  19. Следовательно:
  20. Pi/ 4 = Nпопавших в круг / Nточек; (4)
  21. Pi=4 * Nпопавших в круг / Nточек; (5)
  22.  
  23. */
  24.  
  25. #include <ctime>
  26. #include <cmath>
  27. #include <cstdlib>
  28. #include <iomanip>
  29. #include <iostream>
  30.  
  31. bool IsPointInCircle(double R, double x, double y);
  32.  
  33. int main()
  34. {
  35.     int Npoints;
  36.  
  37.     std::cout << "Insert number of points: ";
  38.     std::cin >> Npoints;
  39.  
  40.     int Nincircle = 0;
  41.  
  42.     srand(time(0));
  43.     unsigned int start = clock();  //variable for counting time
  44.     for(int i = 0; i < Npoints; i++)
  45.     {
  46.         if
  47.         (
  48.             IsPointInCircle
  49.             (
  50.                 1.0,
  51.                 (rand()%(4*Npoints) - 2*Npoints)/(2.0*Npoints),
  52.                 (rand()%(4*Npoints) - 2*Npoints)/(2.0*Npoints)
  53.             )
  54.         )
  55.             Nincircle++;
  56.     }
  57.     std::cout << "Calc  Value of PI : " << Nincircle * 4.0 / Npoints << std::endl;
  58.     std::cout << "Check Value of PI : " << asin(1.0) * 2.0 << std::endl;
  59.    
  60.     unsigned int end = clock();
  61.     std::cout << "Process time: " << (end - start)/1000000.0 << std::endl;  //time in the seconds
  62.  
  63. return 0;
  64. }
  65.  
  66. bool IsPointInCircle(double R, double x, double y)
  67. {
  68.     return ((x*x + y*y) < R*R);
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement