モンテカルロ分析-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