算法篇——随机算法

422 阅读3分钟

随机算法

伪随机:例如伪随机数是使用一个确定性的算法计算出来的似乎是随机的数序,因此伪随机数实际上并不随机。在计算伪随机数时假如使用的开始值不变的话,那么伪随机数的数序也不变。伪随机数的随机性可以用它的统计特性来衡量,其主要特征是每个数出现的可能性和它出现时与数序中其它数的关系。伪随机数的优点是它的计算比较简单,而且只使用少数数值很难推算出计算它的算法。一般人们使用一个假的随机数,比如电脑上的时间作为计算伪随机数的开始值。

cloud.tencent.com/developer/a…

之前讲的算法都是确定的,即对于相同的输入总对应着相同的输出。但实际中也常常用到不确定的算法,比如随机数生成算法**,算法的结果是不确定的,我们称这种算法为(随机)概率算法,**分为如下四类:

1、数值概率算法

用于数值问题的求解,通常是近似解

2、蒙特卡洛算法Monte Carlo

能得到问题的一个解,但不一定是正确解,正确的概率依赖于算法运行的时间,算法所用的时间越多,正确的概率也越高。求问题的准确解;

3、拉斯维加斯算法 Las Vegas

不断调用随机算法求解,直到求得正确解或调用次数达到某个阈值。所以,如果能得到解,一定是正确解。

4、舍伍德算法 Sherwood

利用随机算法改造已有算法,使得算法的性能尽量与输入数据无关,即平滑算法的性能。它总能求得问题的一个解,且求得的解总是正确的。

随机数

概述

计算机产生的随机数都是伪随机数,通过线性同余法得到。

方法:产生随机序列

image-20201102193303658

d称为种子;m取值越大越好;m,b互质,常取b为质数;

蒙特卡罗方法计算圆周率π(java实现) 一、蒙特卡洛(Monte Carlo)方法简介 蒙特·卡罗方法(Monte Carlo method),也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。与它对应的是确定性算法。蒙特·卡罗方法在金融工程学,宏观经济学,计算物理学(如粒子输运计算、量子热力学计算、空气动力学计算)等领域应用广泛。 二、计算圆周率π的原理 通过1/4圆面积和正方形面积的比值可以求出和π相关的一个数值(原理是通过大量随机样本,去了解一个系统,进而得到所要计算的值。)

/** 
 * @author SJ
 * @date 2020/11/6
 */
public class CalculatePI {
    public static double calculatePi(int num){
        int shoot=0;
        for (int i = 0; i < num; i++) {
            double x = Math.random();
            double y = Math.random();
            if ((x*x+y*y)<=1){
                shoot++;
            }
        }
        return (double) 4*shoot/num;
    }
    public static void main(String[] args) {
        double v = calculatePi(500);
        System.out.println(v);
        double v1 = calculatePi(5000);
        System.out.println(v1);
        double v2 = calculatePi(50000);
        System.out.println(v2);
        double v3 = calculatePi(500000);
        System.out.println(v3);

    }
}

结果:

"C:\Program Files\Java\jdk1.8.0_131\bin\java.exe"...
3.08
3.104
3.13264
3.139048

Process finished with exit code 0

一个返回类型为布尔值的方法,被IDEA自动高亮,提示为 Boolean method 'xxx' is always inverted。并提供一个Invert method的解决方案。

一句话解释一下,就是:你这个方法返回值总是被取非(!)使用为啥不直接返回一个取非后的值呢。