Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Вероятность того, что выбранная наугад точка внутри квадрата попадет внутрь окружности равна отношению площадей
- окружности и квадрата, то есть pi/4. Площадь квадрата накрывается сеткой из равноотстоящих точек (чем выше плотность
- точек, тем выше точность вычисления pi). Отношение точек, попавших внутрь окружности, к общему числу точек стремится
- (при увеличении общего количества точек к бесконечности) к вероятности попадания случайной точки внутри окружности,
- то есть pi/4. Если координаты точки x и y ( -1 < x < 1 и -1 < y < 1), то условие попадания точки внутрь окружности
- имеет вид ({x}^{2} + {y}^{2} < 1)
- Суть расчета заключается в том, что мы берем квадрат со стороной a = 2 R, вписываем в него круг радиусом R. И начинаем
- наугад ставить точки внутри квадрата. Геометрически, вероятность P1 того, что точка попадет в круг, равна отношению площадей круга и квадрата:
- P1=Sкруг / Sквадрата = Pi*R2 / a 2 = Pi*R2 / (2 R ) 2= Pi*R2 / (2 R) 2 = Pi / 4 (1)
- Вероятность попадания точки в круг можно также посчитать после численного эксперимента: посчитать количество точек, попавших в круг, и поделить
- их на общее количество поставленных точек:
- P2=Nпопавших в круг / Nточек; (2)
- Так, при большом количестве точек в численном эксперименте вероятности должны вести себя cледующим образом:
- lim(Nточек→∞)/(P2-P1)=0; (3)
- Следовательно:
- Pi/ 4 = Nпопавших в круг / Nточек; (4)
- Pi=4 * Nпопавших в круг / Nточек; (5)
- */
- #include <ctime>
- #include <cmath>
- #include <cstdlib>
- #include <iomanip>
- #include <iostream>
- bool IsPointInCircle(double R, double x, double y);
- int main()
- {
- int Npoints;
- std::cout << "Insert number of points: ";
- std::cin >> Npoints;
- int Nincircle = 0;
- srand(time(0));
- unsigned int start = clock(); //variable for counting time
- for(int i = 0; i < Npoints; i++)
- {
- if
- (
- IsPointInCircle
- (
- 1.0,
- (rand()%(4*Npoints) - 2*Npoints)/(2.0*Npoints),
- (rand()%(4*Npoints) - 2*Npoints)/(2.0*Npoints)
- )
- )
- Nincircle++;
- }
- std::cout << "Calc Value of PI : " << Nincircle * 4.0 / Npoints << std::endl;
- std::cout << "Check Value of PI : " << asin(1.0) * 2.0 << std::endl;
- unsigned int end = clock();
- std::cout << "Process time: " << (end - start)/1000000.0 << std::endl; //time in the seconds
- return 0;
- }
- bool IsPointInCircle(double R, double x, double y)
- {
- return ((x*x + y*y) < R*R);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement