蒙特卡洛算法简单应用

蒙特卡洛算法概是以率统计理论为指导,使用随机数模拟来解决问题的一种方法

最简单的运用:

1.求圆周率π ,  如果半径为1, 根据勾股定理,x² + y² <= 1 的落点都在圆内

   正方形面积:2*2=4,圆面积:πr² = π

   随机生成一个坐标,次数为a,假设有b次在圆内,那么 b/a(落在圆内部次数/落在正方形内部次数) = π/4(圆面积/正方形面积)

   计算可得π=4*b/a


2:积分计算: 计算函数y=x² 在区间[0,1]的面积(红色部分的面积)

随机生成坐标,次数为a, 如果落点在红色区域,应该满足y<=x², 满足条件时累加,命中数为b

那么红色部分面积应该占的比例:b/a


package com.xp.test;

import java.util.Random;

/**
 * 随机数计算圆周率π 蒙特卡洛算法的简单应用,还可用来计算积分等信息
 * 
 * @author admin
 *
 */
public class PI {

	/**
	 * 判断落点是否在圆内部 勾股定理 x² + y² = r² ,那么 x² + y² <= r² 都视作在圆内
	 * 
	 * @param x
	 * @param y
	 * @return
	 */
	public boolean isInCycle(double x, double y) {
		if (x * x + y * y <= 1) {
			return true;
		} else {
			return false;
		}
	}

	public double getPi(int count) {
		Random random = new Random();
		double in = 0;
		for (int i = 0; i < count; i++) {
			double x = random.nextDouble();
			double y = random.nextDouble();
			if (isInCycle(x, y)) {
				in++;
			}
		}
		System.out.println(in + "/" + count);
		return 4 * in / count;
	}

	/**
	 * 判断落点在积分线下的区域
	 * 
	 * @param x
	 * @param y
	 * @return
	 */
	public boolean isInRegion(double x, double y) {
		if (y <= x * x) {
			return true;
		} else {
			return false;
		}
	}

	public double getJifen(int count) {
		Random random = new Random();
		double in = 0;
		for (int i = 0; i < count; i++) {
			double x = random.nextDouble();
			double y = random.nextDouble();
			if (isInRegion(x, y)) {
				in++;
			}
		}
		System.out.println(in + "/" + count);
		return in / count;
	}

	public static void main(String[] args) {
		PI p = new PI();
		// 求π,可以增加循环次数获取更精确结果
		System.out.println(p.getPi(1000000));
		// 求积分
		System.out.println(p.getJifen(1000000));
	}
}


输出结果:

785238.0/1000000
3.140952
332700.0/1000000
0.3327


参考:http://www.ruanyifeng.com/blog/2015/07/monte-carlo-method.html

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学习蒙特卡洛算法可以按照以下步骤进行: 1. 理解基本概念:开始学习蒙特卡洛算法前,了解它的基本概念是很重要的。明确蒙特卡洛算法是一种通过随机抽样来近似计算数学问题的方法。 2. 学习统计学知识:蒙特卡洛算法涉及到随机抽样和统计分析,在学习过程中,了解概率论和统计学的基本知识是必要的。特别是了解随机变量、概率分布、期望、方差等概念。 3. 学习随机数生成:蒙特卡洛方法的核心是通过生成随机样本来进行数值估计。因此,了解如何生成高质量的随机数是必要的。学习随机数生成器的原理和常用的随机数生成方法。 4. 学习抽样技术:蒙特卡洛算法中的抽样技术是关键。学习不同的抽样方法,如均匀抽样、重要性抽样、马尔可夫链蒙特卡洛(MCMC)等。 5. 实践案例:通过实践案例来加深对蒙特卡洛算法的理解和应用。选择一些简单的问题,并使用蒙特卡洛方法进行数值估计,比较结果与理论值的差异。 6. 学习优化技巧:蒙特卡洛算法通常需要大量的样本才能得到准确的结果,因此学习如何优化算法效率也是重要的。了解如何降低方差、提高收敛速度等优化技巧。 7. 探索高级应用:一旦掌握了蒙特卡洛算法的基本原理和应用,可以进一步探索其在金融、物理、工程等领域的高级应用,如期权定价、粒子模拟、优化问题等。 在学习过程中,可以参考相关的书籍、教程和在线资源,同时进行实践和练习,以加深对蒙特卡洛算法的理解和掌握。 希望这个指南对你学习蒙特卡洛算法有所帮助。如果有任何进一步的问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值