背景介绍:
蒙特卡罗法求Π: 是将正方形分成 n*n 个小正方形, 统计落在内接圆内的小正方形个数占所有正方形的比例,
利用四分之一个圆来研究,看落入其中的小正方形有多少个,
并计算概率,再用概率反推π的值,即π=4N/n2 (N表示落入单位圆内正方形的个数)。n 越大结果越精确,运行次数越多。
思路:
生成随机数落点数目模拟四分之一圆的面积
定义两个double 类型的变量x , y 作为落点坐标
单位圆的坐标公式:x*x+y*y=1;
当 x * x + y * y < 1.0时,可以认为落点在圆内
补充知识:
在C++中,srand(time(0)); 这行代码用于设置随机数生成器的种子。srand 函数 是 <cstdlib> 或 <stdlib.h>)库中的一个函数,用于初始化随机数生成器。
time(0) 是调用 <ctime> 库中的 time 函数,并将 0 作为参数传递给它。 这个参数表示获取当前时间的指针,而传递 0 通常意味着不需要获取这个时间戳的地址,而只是想要这个时间戳的值。 time 函数返回从1970年1月1日00:00:00(称为纪元,或Unix时间戳)到当前时间的秒数。
time(0) 返回的是以秒为单位的时间戳
如果在同一秒内多次调用它,将会得到相同的值,这可能会导致随机数生成器在同一秒内产生相同的随机数序列。因此,在需要更高精度或更频繁地生成随机数的应用中,可能需要使用其他方法来获取种子,比如使用更高分辨率的时间函数或者其他随机或伪随机来源。
srand(time(0)); 的作用是以当前时间为种子来初始化随机数生成器。因为时间在不断变化,所以每次程序运行时,std::time(0) 的返回值(即种子)通常都是不同的,这就使得了每次程序运行时生成的随机数序列都是不同的。
上代码:
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<ctime>
using namespace std;
double GetPi(int n) {
double x, y;
int cnt = 0;
for(int i=0;i<n;i++){
x = static_cast<double>(rand()) / RAND_MAX;
y = static_cast<double>(rand()) / RAND_MAX;
if (x * x + y * y < 1) {
cnt++;
}
}
double pi = 4.0 * cnt / n;
return pi;
}
int main() {
srand(time(0));
int n;
cin >> n;
cout << GetPi(n) << endl;
}