一、手动产生随机数方法
计数器是精密器件不能直接产生随机数,但可以让其为产生随机数服务。每个计算机都有其工作频率称为主频,与之相对应的是时钟周期,下面的程序段
DWORD n;
_asm//嵌入汇编语言
{
rdtsc//读计数器值
mov n,eax//计数器低位值进入n
}
的作用是读取自开机以来CPU经历的时钟周期数的低32位数值(高位值变化缓慢在此无用)放到变量 n中,每调用一次 n的数值等于其现有数值加上一个增量得到一个和,如果和超过了n的值域则溢出部分放到 n里,实际上是n中的数值是 rdtsc%N,这里用rdtsc表式计数器的值,N表示n的值域也就是2的32次方,%N表示以N为模做模运算。例如主频是2.2GHz,也就是 n的数值每秒增加2.2G,n是DWORD变量取值范围是4.29G,4.29G除以2.2G得到1.95秒,也就是说每过1.95秒 n数值能变化4.29G,小于这个时间间隔读到得可能是相近的数,极端的例子是可能读到相同的数,所以用大于1.95秒的速度读计数器才能得到0到4.29G之间的任何数值,称这个时间间隔是该值域对应的最小时间间隔。可以看到如果我们手动控制以大于1.95秒的时间间隔读取 n的数值,我们将得到4.29G范围内随机数,人为手动控制本身就是随机事件,因为人不具备控制等间隔时间的能力,间隔时间肯定是变化的、不可控制的所以能得到随机数。1.95秒多的时间产生一个随机数未免太慢了,主频一定时,采样时间间隔小时可以产生较小的随机数,关系很简单
最小时间间隔 = 随机数值域/主频
例如主频还是上面的2.2GHz,让 n是WORD型变量,可以算出最小时间间隔等于29.8微秒,
利用计算机内部计数器生成真随机数原理及实现
最新推荐文章于 2022-04-22 11:30:27 发布