浅谈随机化算法

简介: 一.线性同余法         随机数在计算机中扮演重要角色,不过现实中往往难以产生真正的随机数,很多教材上都采用了线性同余法,产生的随机数也只是在一定范围内,该范围的一定要比研究所使用的范围大,不能没有完全验证就又循环。

一.线性同余法

        随机数在计算机中扮演重要角色,不过现实中往往难以产生真正的随机数,很多教材上都采用了线性同余法,产生的随机数也只是在一定范围内,该范围的一定要比研究所使用的范围大,不能没有完全验证就又循环。

        好事者称上面的性质为随机数要具有周期性,又要不具有周期性(晕),所谓周期性指的是到达一个足够大的数后又要重新开始,非周期性实际就是指范围要足够大,就像C/C++中要求RAND_MAX至少要是32767。

2010111115110229

        其中b >= 0,c >= 0,d <= m。d称为该随机序列的种子。如何选取该方法中的常数b、c和m直接关系到所产生的随机序列的随机性能,不过这是随机性理论研究的内容,不在本文讨论的范围。从直观上看,m应取得充分大,因此可取m为机器大数,另外应取gcd(m, b) = 1,因此可取b为一素数。

        具体原理请读者参考《抽象代数》。

二.随机投点法计算PI值

        其实我最先想到是蒲丰投针实验……请各位读者尽情发挥想象。

        随手谷歌之,发现只要是介绍随机算法的都有这个例子,不过几乎都是C++版本,下面笔者就用Java实现以慰劳广大Java爱好者。

        实验设计如下:

        设有一半径为r的圆及其外切四边形,向该正方形随机地投掷n个点,设落入圆内的点数为m。由于所投入的点在正方形上均匀分布,因而所投入的点落入圆内的概率为圆面积/正方型面积= PI / 4 (与r无关),所以当n足够大时,k与n之比就逼近这一概率,从而,PI 约等于 (4*m)/n。

       Java实现:

/*
 * 遇到了很奇怪的问题,名字叫CalPI就一直找不到主类
 * bin目录下确实没有class文件
 * 咋回事
 */
public class MyPI {

    public static void main(String[] args) {
        int n = 20000000;//进行200w次实验
        int count = calCounts(n);
        double ans = 4.0*count/n;
        System.out.println(ans);
    }

    private static int calCounts(int n) {
        /*
         * java中没有类似C/C++中的fabs,不过abs重载了
         * 如何让Math.random()生成的随机数包括1?
         */
        int count = 0;
        for(int i=0; i<n; i++) {
            double x = Math.random();
            double y = Math.random();
            //实际有些问题,因为无法生成1.0,目前我也不知道咋办
            if((x*x + y*y)<=1.0) {
                count++;
            }
        }
        return count;
    }

}

        结果如下:

200 3.1418832
2000 3.088
20000 3.1512
200000 3.14414
2000000 3.140148
20000000 3.1415662

        观察结果可得并不是试验次数越多结果越精确,而且相同的次数结果也会不同。

三.简单定积分计算

        采用概率方法,不以积分公式。

        假定f(x)为[0,1]上的连续可积函数(其实什么叫可积我也忘了),现需要计算1,实际就等于G2

        分析如下:在图所示单位正方形内均匀地作投点试验n次,则随机点落在曲线下面的概率为3,如果有m个点落在G内,则概率P=m/n,由古典概型可知I=P。

        如果f(x) = ex(x用上标,后面的也在上标里,选中后面的再次单击上标按钮,或者直接在源代码里改<sup>的范围),则只需要把上面的calCounts里的if改成y<x^3并且输出不乘以4就好了。

四. 舍伍德(Sherwood)算法 

五.拉斯维加斯(Las Vegas)算法

六.蒙特卡罗(Monte Carlo)算法      

注意:上面的属于数值概率算法,四五六准备出独立文章,敬请期待。    

目录
相关文章
|
缓存 监控 小程序
App性能测试揭秘(Android篇)
性能测试在移动测试领域一直是一个大难题,它最直观的表现是用户在前台使用 App 时的主观体验,然而决定体验优劣的背后,涉及到了许许多多的技术变迁。阅读此文,带你揭秘App性能测试。
5093 0
App性能测试揭秘(Android篇)
|
6月前
|
机器学习/深度学习 人工智能 并行计算
人工智能平台PAI操作报错合集之version选了0.7.5并在使用learn_loss_weight时遇到报错,如何解决
阿里云人工智能平台PAI (Platform for Artificial Intelligence) 是阿里云推出的一套全面、易用的机器学习和深度学习平台,旨在帮助企业、开发者和数据科学家快速构建、训练、部署和管理人工智能模型。在使用阿里云人工智能平台PAI进行操作时,可能会遇到各种类型的错误。以下列举了一些常见的报错情况及其可能的原因和解决方法。
|
存储 自然语言处理 Java
【重学C/C++系列(五)】:C++中的面向对象编程全解析
C++作为一门在C和Java之间的语言,其既可以使用C语言中的高效指针,又继承了Java中的面向对象编程思想,在去年编程语言排行榜上更是首次超过Java,进入前三。
【重学C/C++系列(五)】:C++中的面向对象编程全解析
|
API Windows
微软新一代输入法框架 TSF - Text Service Framework 小小的研究
原文:微软新一代输入法框架 TSF - Text Service Framework 小小的研究 虽说是转载的,但是其中,有很多我自己的评论,我会用红色的字标出来,参考的博文有: TSF架构:http://blog.
4103 0
|
自然语言处理 Go 数据安全/隐私保护
go08 多语言文本
go08 多语言文本
82 0
|
JSON JavaScript 前端开发
element的Form表单就应该这样用
我们希望把表格的内容,验证规则,甚至于表单的样式,格式都能更规则化,配置化,这样后续我们可以通过构造json去实现一个表单,甚至可用实现拖拽式的构造表单。
127 0
element的Form表单就应该这样用
|
分布式计算 搜索推荐 数据挖掘
数据自定义分析|学习笔记
快速学习数据自定义分析
数据自定义分析|学习笔记
|
关系型数据库 MySQL
|
安全 Windows
Windows系统下电脑强制卡死、关机的邪恶方法
Windows系统下电脑强制卡死、关机的邪恶方法
Windows系统下电脑强制卡死、关机的邪恶方法
|
SQL HIVE 数据格式
OushuDB 创建和管理外部表(中)
创建一个外部表,使用CREATE EXTERNAL TABLE命令。在这个命令里,需声明新表名称,各列名称及其数据类型,基于命令的EXECUTE子句或基于URL的LOCATION子句的外部数据来源,数据格式。
136 0
OushuDB 创建和管理外部表(中)