蒙特卡洛法的基本思想:用事件发生的“频率”来决定事件的“概率”。
计算圆周率就是往一个1*1内的方格里面扔石头,在正方形内切圆内的石头个数/总的石头个数 约等于 pi
本题用到的知识
1. 生成一个0~1之间的随机数(最好设定随机数种子)
首先是随机数种子,利用 srand(time(0)); 来生成
time(0)表示的是从1970年1月1日到你调用函数时所经过的秒数
生成[0~1)的随机数
double a = rand() / double(RAND_MAX);
rand函数本身是可以随机生成从0~rand max之间的随机一个数,~~randmax的值好像每个电脑都不太一样~~
- 两点间的距离公式
根号下...减...平方
代码
#include<bits/stdc++.h>
#include<Windows.h>
using namespace std;
const int N = 1e7;
//N越大 pi越精准
int sum, hit;
int main()
{
srand(time(0));
double a, b;
sum = N;
while (sum--)
{
a = rand() / double(RAND_MAX);
b = rand() / double(RAND_MAX);
double d = sqrt(a * a + b * b);//圆心到点(a,b)的距离
if (d <= 1)//小于1说明在圆内
hit++;
}
double ans = (double) hit*4 / N;
//上述过程计算了1/4圆内的情况,也就是第二象限,所以最后结果要乘4
printf("%lf", ans);
}
根据设定
d
来限制采样的落点范围,并以点数除➗N来实现π的近似不错,这种随机采样很好