【基本算法】概率算法

1、什么是概率算法?

概率算法依照概率统计的思想来求解问题,其往往不能得到问题的精确解,但是在数值计算领域得到了广泛的应用。因为很多数学问题,往往没有或者很难计算解析,此时便需要通过数值计算来求解近似值。概率算法执行的基本过程如下:

  (1). 将问题转化为相应的几何图形S,S的面积容易计算,问题的结果往往对应几何图形中某一部分S1的面积。

  (2). 然后,向几何图形中随机撒点。

  (3). 统计几何图形S和S1中的点数。根据S和S1面积的关系及各图形中的点数来计算得到结果。

  (4). 判断上述结果是否在需要的精度之内,如果未达到精度则执行步骤(2)。如果达到精度,则输出近似结果。

概率算法大致分为如下4种形式:数值概率算法;蒙特卡罗(Monte Carlo)算法;拉斯维加斯(Las Vegas)算法;舍伍德(Sherwood)算法;

2、概率算法的应用

计算π的近似值

圆周率π是一个非常重要的常数,无论在数学还是在物理学上都有很广泛的用途。π的值直接关系到计算圆周长、圆面积、球体积等。π一般定义为圆周长与圆直径之比。在数学分析学中,圆周率π被严格定义为满足如下等式的最小正实数:sin(x) = 0{\color{Red} },圆周率 π=3.141592653589793…… ,其是一个无限不循环实数,即所谓的无理数。圆周率π的精确计算,从古至今都非常重要。

蒙特卡罗(Monte Carlo)算法是一种以概率为基础的、非常重要的数值计算方法,在工程、金融、计算物理学等领域都有着重要的应用。蒙特卡罗算法是如何计算圆周率π的呢?我们先画一个半径为1的圆,如图所示:

先来推算图中阴影部分的面积,阴影部分是一个圆的1/4,因此有如下计算公式:S阴影 = S圆 /4 = (1/4)π*r^2 = π/4 ,而图中正方形的面积则为:S正 = r^2 = 1,这样,按照图示建立一个坐标系。如果均匀地向正方形内撒点,那么落入阴影部分的点数与全部的点数之比就是S阴影/S正方形=π/4。根据概率统计的规律,只要撒的点足够多,就会得到近似的结果。通过这个原理便可以计算圆周率π的近似值,这就是蒙特卡罗算法。

蒙特卡罗算法有几个关键点:

  • 均匀撒点:使用随机方法来实现,产生[0,1]之间随机的坐标值[x,y]。
  • 区域判断:图中阴影部分的特点是距离坐标原点的距离小于等于1,这样,可以通过计算判断x^2+y^2≤1来实现。

通过蒙特卡罗算法计算π的近似值,Java实现demo演示如下:

public class Test {
    /**
     * 打印结果:
     *  n = 6000 ------> π = 3.1466666666666665
     *  n = 600000 ------> π = 3.1464866666666667
     *  n = 60000000 ------> π = 3.1413683333333333
     *  n = 600000000 ------> π = 3.1415774266666667
     **/
    public static void main(String[] args) {
        int n = 6000;
        System.out.println("n = " + n + " ------> π = " + getMontePI(n));
    }

    public static double getMontePI(int amount) { // amount为阴影区域的撒点数
        int cnt = 0; // 统计落在阴影区域的点
        Random random = new Random();
        for (int i = 1; i < amount; i++) {
            // 阴影区域范围:x^2+y^2≤1
            if (Math.pow(random.nextDouble(), 2) + Math.pow(random.nextDouble(), 2) <= 1)
                cnt++;
        }
        return 4.0 * cnt / amount; // π概率计算公式
    }
}

从测试结果可知:撒点数n越多,概率统计得到π的值越精确。同时,由于概率算法的随机性,在不同的运行时间,即使输入同样的撒点数,得到的结果也是不相同的。

参考书籍:《Java常用算法手册(第3版)》

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值