蒙特卡洛分析-使用opencv和c++计算精确的圆周率

效果:

代码:

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换成大数输出函数,就可以输出高精度的结果。

猜你喜欢

转载自blog.csdn.net/XLcaoyi/article/details/90668666