蒙特卡罗(Monte Carlo)算法计算圆周率的主要思想:给定边长为R的正方形,画其内切圆,然后在正方形内随机打点,设点落在圆内的概为P,则根据概率学原理:
P = 圆面积 / 正方形面积 = PI * R * R / 2R * 2R = PI / 4。
即 PI=4P。这样,当随机打点足够多时,统计出来的概率就非常接近于PI的四分之一了。
int main()
{
const int MAX_TIMES = 200000000;
srand(static_cast<unsigned int>(time(0)));
int inside = 0;
for(int i = 0; i < MAX_TIMES; ++i) {
double x = static_cast<double>(rand()) / RAND_MAX;
double y = static_cast<double>(rand()) / RAND_MAX;
if(x * x + y * y <= 1.0) ++inside;
if(i % (MAX_TIMES / 100) == 0) cout << '.';
}
double pi = 4.0 * inside / MAX_TIMES;
cout << "/nPI = " << pi << endl;
return 0;
}
最后,直觉告诉我:如果采用值域更大的伪随机数发生器(标准库中的rand能常只产生最大为三万多的伪随机数),结果应该可以更好。