(图片来自网友‘亦水木’的提供,特此说明并感谢)
按:胡大伟老师在我的博文《有关演化博弈模拟仿真中的技术操作和机理分析的相关性辨析》一文后,提出了一个很有趣的问题:“计算机的Monte Carlo实验到底能不能生成真正的随机数?”以下是笔者对这个问题的简要回答和补充回答。
关于这个问题,20年多前我在做我的博士论文时(因为涉及到最优化方法的求解问题,那套方法中就需要用到随机数),就曾经对这个问题仔细思考过,当然后来在科研工作中也曾经再次思考过这个问题。今天碰巧胡老师提起这个问题,我就概要地讲讲我现在对于这个问题的理解和想法。简要来说我的观点是:不论是任何生成随机数的方法,关键是这种方法里是否存在至少一个以上的真正随机的‘种子’,如果存在的话,那么这种方法就可以生成真正的随机数,否则就是伪随机。因此,任何纯粹采用数学函数来获得随机数的方法,都是伪随机,因为没有任何一个纯粹的数学函数是在起点上真正随机的。沿着这个思路继续推衍的话,我认为要想通过数学运算,尤其是计算机运算的方法得到真随机数的一个可行的方法是:直接引用每次调用随机数的要求开始时的时钟读数来作为随机数的‘种子’(对于计算机来说,更具有这个优势,因为计算机的时钟周期非常小,因此这个基于时钟的随机数‘种子’有非常大的取值空间,可以使得随机数‘种子’的覆盖范围非常大。此外,如果在此基础上,存储和调用这个方法所得到的前几个或前非常多个以往的随机数的话,最终产生的随机数的变化范围就可以更加大了)(需要补充的一点是,这个思路方法我当时在我的博士论文的模型求解中就已经是这么做的了,不过当时并没有在博士论文的正文中详细说明我当时所采取的这个方法,现在回想起来,这个方法本身应该也算是一个具有创新性的做法,似乎直至现在有关随机数的教材中也没有书籍和文献提到过这样一个简便而又易行的真随机数产生方法。当然,如果有读者能找出文献证明其实早已经有学术文献明确提到了这个方法的话不胜感谢,但我仍要声明的一点是:我直到现在也从未看到过也没有去细查这类文献,有关用‘直接引用每次调用随机数的要求开始时的时钟读数来作为随机数的种子来产生真随机数’的这个想法是我自己当年做博士论文时自己想出来的)。
还需要补充的是:胡老师的这个问题应该还指向了:在博弈模型的求解过程中,添加随机干扰是否能起到对真随机过程的有效模拟的含义。关于这一点,我觉得这的确是一个值得深入分析的研究课题,更为具体地,我认为:可以尝试用不同的随机干扰方法来测试这种随机干扰方法的选择本身是否会对博弈模型求解产生重大影响,如果有重大影响的话,究竟能意味着什么?更为具体地:如果没有重大影响的话最好,应该能说明模型仿真求解方法是稳定的和靠谱的;但如果产生了重大影响的话,就意味着现有的仿真求解方法可能存在尚未发现的重大缺陷。这个问题我没有亲自研究过,在此只是提出上述设想,有兴趣的读者可以自行去尝试看看能得到什么样的结果以及其中的启示究竟会是什么。
此外,在随机数的产生问题上,既可以尝试用传统的计算机计算数学模型的方法来获得各种分布特征的伪随机数,也可以尝试用笔者在上文所提到的用直接引用每次调用随机数的要求开始时的时钟读数来作为真随机数的‘种子’的方法来产生真随机数,还可以是将上述两种方法结合起来来产生既含有真随机数‘种子’,同时有具有事先选定的分布规律的半真半伪的随机数。上述方法排列组合地进行运用后,也许可以在实践中发现一些有意思的东西(比如上文所提到的事情,以及采取不同的随机数方法是否会对博弈模型的求解结果产生重大的且有规律性的影响?)等等。
后记:写完本文后,在发出这篇文章之前,笔者用网络搜索了以下,发现其实已经有文章提出了用时钟做种子来产生真随机数的方法(比如《使用MSP430内部时钟生成随机数——生成真随机数入门指南》2008年),但具体谁是第一个提出这个方法的人也许就不好准确判断了。此外,20多年前我自己设计并采用的这个方法“存储和调用这个方法所得到的前几个或前非常多个以往的随机数的话,最终产生的随机数的变化范围就可以更加大了”,应该更加有利于获得随机性更大的真随机数,可以有助于避免在第一个真随机数获得之后通过计算得到的后续系列随机数过度依赖于第一个随机数的问题。
转载本文请联系原作者获取授权,同时请注明本文来自钟定胜科学网博客。
链接地址:https://wap.sciencenet.cn/blog-3234816-1382219.html?mobile=1
收藏