蒙特卡罗法求Π(pi) 与srand(time(0))函数详解

背景介绍:

蒙特卡罗法求Π:是将正方形分成 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;
}
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值