效果:
代码:
int main()
{
Mat img = Mat::zeros(Size(300, 300), CV_8UC3);
int rect_width = 300;
int rect_height = 300;
int circle_radius = 150;
circle(img, Point(150, 150), 150, Scalar(255, 255, 255));
int display = 100;
int rect_count = 0;
int cir_count = 0;
int i = 1;
while(1)
{
float r_x = rand()% RAND_MAX*1.0/ RAND_MAX *300;
float r_y = rand()% RAND_MAX*1.0/ RAND_MAX *300;
float dist = sqrt(pow(r_x - circle_radius, 2) + pow(r_y - circle_radius, 2));
if (dist < circle_radius)
{
cir_count++;
}
else
{
rect_count++;
}
if (i++%display == 0)
{
printf("PI=%f\n", 4.0*cir_count / (rect_count+ cir_count));
i = 1;
}
line(img, Point(int(r_x), int(r_y)), Point(int(r_x), int(r_y)), Scalar(0, 0, 255), 2);
imshow("img", img);
waitKey(1);
}
}
--------------------------------------------------------------------------------------------------------------------
蒙特卡洛分析是一种随机抽样算法,应用于圆周率的计算体现的比较直接,算法本身很简单但逻辑结构很完整,
这就是平时说的方法与方法论的区别。一套方法可以应用于很多领域,其贡献比一个具体的方法更有价值。
这段代码使用的是while死循环,最后会整形溢出,需要自己用链表构造大数运算,或者用现成的大数运算库。
把rect_count和cir_count换成大数,把printf换成大数输出函数,就可以输出高精度的结果。