蒙特卡洛算法(C++)

蒙特卡洛算法是一个基于几何概率模型的近似估计真实值的方法,可以近似估计出圆周率π和一些被积函数比较复杂不容易求出积分的积分值。

近似估计出圆周率π举例:

假设在正方形内投掷随机点数量为N(N∈N*),则按几何概率,当N很大时,落在圆中数量为n(n∈N*), 而N与n的比值等价于两者的面积比,即:

πr²/4r²= n/N

=>  π = 4n/N

C++代码实现:

#include <iostream>
#include <random>
#include <cmath>

const double r = 2;

double Random(int min, int max);

class location {
public:
	double x, y;

	location(double x, double y) {
		this->x = x;
		this->y = y;
	}
	location() {
		this->x = Random(0, 2 * r);
		this->y = Random(0, 2 * r);
	}
};

// 随机[min,max]
double Random(int min, int max) {
	// 生成[0,1]
	double random_number = (double)std::rand() / RAND_MAX;

	// 生成一个整数部分范围为 [min,max-1] 的随机数。
	int integer_part = std::rand() % max;

	// 将整数部分与随机数的小数部分相加。
	double result = static_cast<double>(integer_part) + random_number;

	return result;
}

double GetPai(int N) {
	location center(r, r);
	int n = 0;

	for(size_t i = 0; i < N; i++) {
		location happen;
		bool ifCircle = pow((happen.x - center.x), 2) + pow((happen.y - center.y), 2) <= pow(r, 2);
		ifCircle&& n++;
	}
	double Pai = (double)4 * n / N;

	return Pai;
}
int main() {
	int N;
	while(true) {
		std::cout << "请输入蒙特卡洛试验次数:" << std::endl;
		std::cin >> N;
		double pai = GetPai(N);
		std::cout << "PAI计算结果为:" << std::endl << pai;
		std::cout << Random(1, 10)<<std::endl;
	}
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_xian_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值