蒙特卡洛算法(Monte Carlo algorithm)求圆周率

蒙特卡洛算法是统计模拟算法的一种,蒙特卡洛算法的数学理论基础是大数定理,在事件发生次数多的情况下,利用事件发生的频率作为时间发生概率的近似值

统计问题可直接求解,对于连续问题可不用离散化

与穷举法相对比而言,属于随机搜索,而穷举法属于给定特定规则的搜索

下面给出一个实例,来让蒙特卡洛算法求出圆周率

在一个2*2的矩形内,随机生成点,求在圆中相对矩形的数量比例,从而推出圆周率

推导过程:

矩形面积:圆的面积 = 所有点的数量:落在圆中点的数量

=> 4r*r :Pi*r*r = 所有点的数量:落在圆中点的数量

=> Pi = 4*落在圆中点的数量/所有点的数量

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

#define Step 100000000  //模拟实验的次数

int main()
{
	srand((unsigned)time(NULL));

	int inside = 0;
	for(int i = 0; i < Step; ++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;  //如果点在圆内则,让inside记录下来
		}
	}	
	
	double pi = 4.0 * inside / Step;
	cout << "PI = " << pi << endl;
	return 0;
}

求了几次发现只有小数点后前几位精确,若想提高精度,可增大step数,从而有更精确的求解

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值