使用C++并采用蒙特卡洛方法求图1中阴影部分的面积
蒙特卡洛方法举例:用蒙特卡罗方法计算圆周率π。
1. 正方形内部有一个相切的圆,如图2所示。
图2 与圆型相切的正方形
2. 圆形的面积与正方形的面积之比是π/4,面积之比如式(1)。
(1)
3. 现在,在这个正方形内部,随机产生10000个点(即10000个坐标对 (x, y)),计算它们与中心点的距离,从而判断是否落在圆的内部,如图3所示。
图3 随机产生正方形内部的点
4. 如果这些点均匀分布,那么圆内的点应该占到所有点的 π/4,因此将这个比值乘以4,就是π的值。通过随机模拟30000个点,π的估算值与真实值相差0.07%。
// Q764555.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
#include <iostream>
#include <math.h>
#include <time.h>
using namespace std;
int inshader(float x, float y)
{
if (x < 5) return 0;
if (sqrt((x - 5) * (x - 5) + (y - 5) * (y - 5)) < 5) return 0;
if (sqrt((x - 15) * (x - 15) + (y - 5) * (y - 5)) < 5) return 0;
if (x * 0.5 + y < 10) return 0;
return 1;
}
int main()
{
int N = 10000;
srand((unsigned)time(NULL));
int c = 0;
for (int i = 0; i < N; i++)
{
float x = rand() / (float)(RAND_MAX);
float y = rand() / (float)(RAND_MAX);
x *= 20;
y *= 10;
if (inshader(x, y)) c++;
}
printf("结果 %lf", 10.0 * 20 * c / (double)N);
}
结果 19.900000
Press any key to close this window . . .