经常听到白痴的声音: 计算机是有限状态机,不能生成随机数...但是实际上,计算机可以在硬件驱动过程中生成随机数.

首先让我们看一个让计算机控制室内温度的示例. 工作条件大致是这样的. 首先随机数生成原理,计算机必须具有温度检测传感器和温度控制空调. 计算机达到室温后,将其与设定温度进行比较. 如果温度过高,空调将开始冷却,如果温度过低,则空调将开始加热. 此时,室温是一个以设定温度为中心的变量随机数生成原理,可以从中提取随机数.

我们知道计算机的显示和声音也是硬件驱动程序. 计算机通过驱动图形卡和声卡来实现显示和声音,并且图形卡和声卡具有自己的逻辑处理器. 计算机向它们发出的指令不是两者都可以立即执行. 安排它们各自的处理器根据其各自的状态执行计算机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位数组中很好地工作,并且可以组合其他位数据.

通过检测生成大量数据,不存在周期性现象,即永不重复. 当数组的长度很大时,所有元素都具有相同的随机概率,因此它们是真实的随机数. 在需要少量随机数的情况下,它也很有用,它很简单,不需要其他硬件.

这里只是利用某些功能的特性来达到产生随机数的目的,因为它不是专门设计制造的,所以效率不高,并且达到了约10k字节/秒的速度. 一个600M的笔记本电脑.

[培训]“ Android高级培训班(课程)”于9月开始报名!挑战极限,加倍薪水!

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly/a/jisuanjixue/article-254485-1.html

更多推荐

计算机常用随机数生成原理,[原始]计算机生成的真实随机数的原理和实践