利用计算机内部计数器生成真随机数原理及实现


一、手动产生随机数方法
  计数器是精密器件不能直接产生随机数,但可以让其为产生随机数服务。每个计算机都有其工作频率称为主频,与之相对应的是时钟周期,下面的程序段
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微秒,如果 n是BYTE型变量,所需间隔0.12微秒。根据自己的需要选择即可。但是如果需要大随机数,用小的合成大的比直接产生大的效率要高得多。
  设置一个按钮,依照上面方法,让程序实现点击按钮产生一个随机数即可做成手动生成随机数的程序。此外还有保存、显示等问题就不多说了都是很简单的。

二、自动产生随机数方法
  我们知道计算机是多任务系统,往往几十个任务同时执行,由于采用了分配时间片的方式处理各个任务,还要应付突发的中断处理等,所以对较复杂的任务很难在相同的时间内完成,这是个普遍现象,利用这个特点我们就可以得到随机数。只要用大于最小时间间隔的变化时间的时间间隔读计数器的数值就可以自动获得随机数。且看下面的例子。
  这是调用函数Beep(0,0)所需时间的试验(单位秒,这是在一个CPU是4000+的兼容机做的实验,使用VC++编制的小程序)
0.0001883,0.0001872,0.0001866,0.0001869,0.0001844,0.0001863,0.0001889,0.0001858,0.0001855,0.0001891
  平均值 0.0001869
  最大值 0.0001891
  最小值 0.0001844
  可以看到函数运行所需时间是变化的,围绕一个中心值上下起伏,如果以此时间间隔读取计数器的值,生成TYPE型数组就是随机的,时间间隔远远大于生成TYPE的最小时间间隔。下面的程序放到VC++按钮函数里可直接运行,产生并显示100个BYTE型随机数。
BYTE *str;//定义数组指针
int i=0;
int NN=100;//数组长度 
DWORD n;
str = new BYTE[NN];//借用内存
for(i=0;i<NN;i++)//循环生成随机数组
{
_asm//嵌入汇编语言
{
rdtsc//读计数器
mov n,eax//低位值放到 n里
}
str[i] = (BYTE)n;//建立随机串
Beep(0,0);//不定期延时函数
}
CString aa,bb="";//定义字符串
for(i=0;i<NN;i++)
{
aa.Format("%u ",str[i]&0xff);//格式化输出
bb=bb+aa;
}
MessageBox(_T(bb));//显示随机数组的数据
delete [] str;//归还内存
  这段程序只是用来证实计算机是可以产生随机数的,其中用到的Beep()函数,其它函数也可以,例如SetWindowText(),GetWindowText()等等,函数太简单调用时间过短,n近似相等是不能产生随机数的,但对简单函数多调用几遍也能达到目的。这里只是用简单的方法证实计算机是可以产生随机数的,并不是实用程序,所以效率不高,有更好的办法但不如这个例子说明问题来的直接。
  以此方式产生的随机数,是没有周期、不能重复产生的乱码。随机数组中的成员都是独立的,你不能从前面的数据推论出后面的数据。所以它们是真随机数。
  

猜你喜欢

转载自blog.csdn.net/sjd163/article/details/5315733