YonghongLiu的个人博客分享 http://blog.sciencenet.cn/u/YonghongLiu

博文

计算机能产生随机数吗?

已有 3351 次阅读 2023-3-30 07:20 |个人分类:学术|系统分类:论文交流

计算机能产生随机数吗?

武汉理工大学:刘永红

Fig7.jpg

冯·诺依曼(Von Neumann)美籍匈牙利数学家、计算机科学家、物理学家、现代计算机之父,他说:“任何人如果相信计算机能够产生出真正的随机的数序组都是疯子。”

是的,科学家往往用这样的话语来忠告一些人,类似的,制作“永动机”,也被科学家发自内心的忠告。

现在的问题是,我们不用计算机,用什么呢?未必用摇奖机产生。实际上,可用物理方法产生随机数,但价格昂贵,不能重复,使用不便。

因此,非计算机莫属也!用计算机——这个由人类大脑构思出来的最精确、最有判断力的机器,可以说任一程序都将产生一个完全可以预测的结果,因此,并不能够产生真正的随机数。但,事实上我们使用计算机“随机数发生器”,这个序列称之为“伪随机序列”。这种方法是用数学递推公式产生的。它所产生的序列,与真正的随机数序列不同,所以称为伪随机数,或称为伪随机数序列。不过,经过科学家多种统计检验表明,它与真正的随机数或随机数序列具有相近的性质。因此,可放心的把它作为真正的随机数来使用。

由已知分布随机抽样有各种方法,与从(0,1)上均匀分布抽样不同,这些方法都是借助于随机序列来实现的,也就是说,都是以产生随机数为前提的。由此可见,随机数是我们实现蒙特卡罗(Monte Carlo)模拟的基本工具。值得一提,Monte Carlo方法的基本思想很早以前就被人们所发现和利用。早在17世纪,人们就知道用事件发生的“频率”来决定事件的“概率”。但,蒙特卡罗模拟有一个危险的缺陷:如果必须输入一个模式中的随机数并不像设想的那样是随机数,而却构成一些微妙的非随机模式,那么整个的模拟(及其预测结果)都可能是错的。举一个有趣的例子,由美国佐治亚大学的费伦博格博士作出的一分报告证明了最普遍用以产生随机数串的计算机程序中有5个在用于一个简单的模拟磁性晶体中原子行为的数学模型时出现错误。科学家们发现,出现这些错误的根源在于这5个程序产生的数串其实并不随机,它们实际上隐藏了一些相互关系和样式,这一点只是在这种微小的非随机性歪曲了晶体模型的已知特性时才表露出来。

Monte Carlo方法能很好地用来对付维数的灾难问题,因为该方法的计算复杂性不再依赖于维数。以前那些本来是无法计算的问题现在也能够计算量。为提高方法的效率,科学家们提出了许多所谓的“方差缩减”技巧。另一类形式与Monte Carlo方法相似,但理论基础不同的方法,即“拟蒙特卡罗方法”(Quasi-Monte Carlo方法)。我国数学家华罗庚、王元提出的“华—王”方法即是其中的一例。这种方法的基本思想是“用确定性的超均匀分布序列(数学上称为Low Discrepancy Sequences)代替Monte Carlo方法中的随机数序列。对某些问题该方法的实际速度一般比Monte Carlo方法提高数百倍,重要的是,还可计算精确度。

从计算机实现的角度看:在[0,1]内以同样的概率所产生出来的一系列随机数。我们有下面几种方法可以得到:

1)用专门的随机表产生随机数。(速度慢且占内存,在计算机上很少用);

2)在计算机外表建立专门的物理装置,如热噪声源,按其噪声电压的大小表示不同的随机数。(随机性很好,但产生过程非常复杂);

3)用一定的算法在计算机内产生所需要的随机数,如调用时钟的算法。(使用广泛的方法);

4)用MATLAB仿真工具(分析与举例,见附录)。

但是,通常第i+1个随机数是用第i个随机数按照一定的公式计算出来的结果,这不是真正的随机数,我们称为伪随机数。实践证明,这种伪随机数已能够充分满足模拟以及其他随机过程计算的需要,其产生过程方便可行。

产生伪随机数算法的基本原则,或者说应满足五条基本要求:

1)所产生的数字必要尽可能接近均匀分布。

2)必须具有较长的循环周期,即应产生大量的随机数之后才出现重复现象。

3)不能发生退化现象,即不出现反复产生同一常数的情况。

4)不能发生偏爱现象,即几个数出现明显多于其他常数的情况。

5)应有再显性,即同样条件下,可以复现相同的随机数序列,同条件下的稳固性。

常见的伪随机数算法(伪随机数发生器)有三种:

1)平方取中法;

2)乘积取中法;

3)乘同余数法。

数学家们称这种随机模拟表述为“模式”,而当一种模式足够精确时,他能产生与实际操作中对同一条件相同的反应。

总之,如果你有一个产生伪随机数新的算法,请对照上面提到的五条基本原则(要求),看是否满足要求?如果你死纠缠这个问题——计算机到底存在还是不存在随机数发生器,那么,就这一点看,你就是一个未来的哲学家。

附录:

仿真举例 :MATLAB用于随机数据分析(试验·教学演示)

MATLAB有两个产生随机数的函数:

1)randmn)产生0与1之间均匀分布的mn列随机矩阵,其均值为0.5,标准差(均方根差)为0.2887;

2)randnmn)产生正态分布的mn列随机矩阵,其均值为0,标准差(均方根差)为1。

他们的分布情况可以用直方图命令histxN)来显示。其中N表示直方图横坐标的分割数(它的默认值为10)。

例1.设x是均匀分布, =1,=1000,把处于0~0.1,0.1~0.2,…,0.9~1.0各个区间中的数目分别清点出来,画成直方图。(理想情况应该是一条直线,= 12499000。若= 12,其他不变,就不理想直线了)= rand(1,30000);hist(x)。


例2.设是正态分布,把的最小值和最大值分成50份进行统计,得到一个“钟形”图,即正态分布。(理想情况的值是钟形,= 30000000)= randn(1,30000);hist(y,50)。




https://blog.sciencenet.cn/blog-3519678-1382317.html

上一篇:科技上的试金石
下一篇:纯粹数学:研究生腾飞的基石
收藏 IP: 119.98.142.*| 热度|

8 张学文 郑永军 钟定胜 黄河宁 贾玉玺 尤明庆 杨正瓴 guest85592150

发表评论 评论 (6 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-11-22 00:17

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部