概述
计算机生成真随机数原理及实践
经常可以听到一种痴语:计算机是有限状态机,不能产生随机数...。但实际上计算机在硬件驱动过程中是可以生成随机数的。
首先看一个例子我们让电脑控制室内温度,工作情况大致是这样的,首先电脑要有探测温度的传感器、和控制温度的空调,电脑得到室温后和设定温度进行比较,如果温度过高则启动空调降温、过低则启动空调升温,这时室温就是以设定温度为中心的变数,从中可以提取随机数。
我们知道电脑的显示和发声也都是属于硬件驱动,电脑通过对显卡和声卡的驱动达到显示和发声,而显卡和声卡都有自己的逻辑处理器,计算机向它们发出的指令并不是都能得到立即执行的,它们各自的处理器要根据自己的状态安排执行计算机CPU指令,所以对某些指令的执行时间是不确定的,具体表现在执行某些函数时运行时间是随机的。我们利用这种时间的不确定性就可以让计算机程序生成随机数。
例如C++语言中的Beep(0,0),SetWindowText(NULL),MessageBeep(MB_ICONQUESTION)等,其它语言的函数也有类似情况是肯定的。
我们只要连续调用此类函数,监测其执行时间,处理执行时间就可以达到目的。但函数的执行时间都是很短暂的,用一般测量时间的方法都太粗糙了,必须自己设计度量方法。每个计算机都有其工作频率称为主频,与之相对应的是时钟周期,做一个函数读取计算机运行以来的时钟周期,用函数运行时计算机所经历的周期数来度量时间;测量一下当前的周期数,让函数运行,再测量一下当前的周期数,两个周期数的差值再减去一个本底值就代表了函数运行时间,如此做多个循环就可以大量采集运行时间了,处理运行时间数组得到随机数组。
且看实验数据:
连续调用Beep(0,0)函数的运行时间115636,114283,114899,115030,114488,114350,114866,115132,114317,114757
处理数据的方法很多这里只用最简单的方式。
将结果放在字数组里则有 50100,48747,49363,49494,48952,48814,49330,49596,48781,49221
放在字节数组里则有 180,107,211,86,56,174,178,188,141,69
显然放到16位的字数组里效果不好,这是因为函数运行时间只比16位的最大值大0.7倍左右。但放到8位数组里效果不错,而其它位数的数据由此组合即可。
通过生成大量数据的检测没有发现周期现象,也就是从不重复的,数组长度大时所有元素等概率出现随机性良好,所以它们是真随机数。在需要少量随机数的地方还是有用的,它发生简单并且不需要其它硬件。
这里只是利用某些函数的特点来达到生成随机数的目的,因为不是专门设计制作的,所以效率不高,在主频600M的笔记本上大约达到 10k字节/s的速度。
最后
以上就是顺心芹菜为你收集整理的计算机无法实现真随机数,计算机生成真随机数原理及实践的全部内容,希望文章能够帮你解决计算机无法实现真随机数,计算机生成真随机数原理及实践所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复