首先看如下图
假设如上,圆的半径为r,在正方形内随机投n个顶点。落在圆内的顶点为k个。由于是随机投点,所以随着n
增大,可以近似认为k/n = PI*R*R/(2R*2R);
也就是k/n=PI/4; 得到k*4/n = PI.
根据上述思想写程序如下:
/************************************************************************/
/* coder: huifeng00 at 2010-7-2 20:00 */
/************************************************************************/
#include <iostream>
#include <math.h>
#include <time.h>
using namespace std;
double calPI(int n)//这里的n表示要生成的点数
{
int x,y;
int k=0;
for (int i=0;i<n;i++)
{
x = rand()%1001;
y = rand()%1001;
if (x*x+y*y<=1000000)
{
k++;
}
}
return k*4.0/n;
}
int main()
{
int n;
srand(time(NULL));
while(1)
{
cin>>n;//输入要投的点数
if(n<=0)break;
cout<<n<<": "<<"PI="<<calPI(n)<<endl;
}
return 0;
}
有感:程序不难,只是记录随机的思想很不错,看随机快速排序的时候的感觉。
注:随机快速排序和普通快速排序的不同是它每次基点的选择是随机的。