効果:
コード:
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を大きな数の出力関数に置き換えて、高精度の結果を出力します。