ni+1=(af(ni)+b)mod M i=0,1,…,M-1
ni+1=(a*ni+b)mod M i=0,1,…,M-1
Random(n,m,seed,a,b)
{
r0 = seed;
for (i = 1;i<=n;i++)
ri = (a*ri-1 + b) mod m
}
srand( (unsigned)time( NULL ) )
//包含头文件
void main() {
int count=0;
for (int i=0;i<10;i++){
srand((unsigned)time(NULL));
count++;
cout<<"No"<
程序段1中由于将srand()函数放在循环体内,而程序执行的CPU时间较快,调用time函数获取的时间精度却较低(55ms),这样循环体内每次产生随机数用到的种子数都是一样的,因此产生的随机数也是一样的。而程序段2中第1次产生的随机数要用到随机种子,以后的每次产生随机数都是利用递推关系得到的。 基于MFC的随机校验码生成
Web应用程序中经常要利用到随机校验码,校验码的主要作用是防止黑客利用工具软件在线破译用户登录密码,校验码、用户名、密码三者配合组成了进入Web应用系统的钥匙。在利用VC开发的基于客户机/浏览器(Client/Server)模式的应用软件系统中,为了防止非法用户入侵系统,通常也要运用随机校验码生成技术。
本实现要用到以上介绍到的伪随机数生成技术。校验码数据将以16进制码方式显示。主要代码如下:
void CRandompasswordDlg::OnCreatekey() {
int RanCheckNum = 0;
char out[25]={0};
char keytemp[5]={0};
memset(out,0x30,18);
srand((unsigned)timeGetTime());//产生随机数种子
for(int i=0;i<6;i++){
RanCheckNum = rand();//产生随机数
_itoa(RanCheckNum,keytemp,16);//将随机数转换成16进制
memcpy(&out[i*4],keytemp,strlen(keytemp));
}
out[24]=0x00;
strcpy(m_key.GetBuffer(18),out);
UpdateData(FALSE);
}
运行结果如图1所示:
图1 利用伪随机数生成随机校验码
程序运行时,由于每一次点击"产生随机校验码"的系统时间不同,生成随机数的种子就不一样,因此产生的随机数也是不一样的,从而保证了校验码生成的随机性。
利用ImagePassword工具产生随机密码
ImagePassword提供一个可选择的图形阵列,通过随机改变图形阵列中的阵点图形来产生随机密码。当随机点击图象阵列中的图象阵点,该阵点中的图象发生变化。其运行界面如图2所示:
图2 ImagePassword运行界面
点击OK按钮后所产生的随机密码如图3所示:
图3 ImagePassword运行结果
ImagePassword产生的密码的随机性依靠于用户对图象阵列中阵点图象的随机选择,一般来说用户在图象阵列中随机点击鼠标的次数越多,最后产生的密码的随机性越强。
结束语
伪随机数在不同的软件系统中都得到了很广泛的应用,如何选择随机数生成种子使得生成的伪随机数性能更佳是软件设计者追求的目标之一。本文提到了利用系统时间作为种子参数在一定条件下可以满足软件的随机性需要。利用所产生的随机数在游戏编程,如扑克类游戏中的随机发牌,俄罗斯方块的随机生成等等其他应用中都起到很重要的作用。
新闻热点
疑难解答