网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > DotNet > VC.NET > 在VC++中生成伪随机数祥解  

在VC++中生成伪随机数祥解

2007-02-27  作者:bitsCN整理  来源:中国网管联盟  点评 投稿 收藏

  摘 要 伪随机数在计算机软件设计中有很广泛的用途。本文介绍了基于数学方法的利用计算机产生伪随机数的一种方法,即线性同余法,任何伪随机数的产生都是运用递推的原理来生成的。以及在Visual C++环境中产生伪随机数的两个重要函数,rand和srand函数,正确地使用这两个函数是产生性能良好的伪随机数的关键,最后介绍了利用伪随机数生成技术在MFC中生成基于C/S模式应用程序的随机校验码以及利用一种软件工具ImagePassword产生随机密码。

   关键词 伪随机数生成;线性同余法;Visual C++;随机校验码

  为追求真正的随机序列,人们曾采用很多种原始的物理方法用于生成一定范围内满足精度(位数)的均匀分布序列,其缺点在于:速度慢、效率低、需占用大量存储空间且不可重现等。为满足计算机模拟研究的需求,人们转而研究用算法生成模拟各种概率分布的伪随机序列。伪随机数是指用数学递推公式所产生的随机数。从实用的角度看,获取这种数的最简单和最自然的方法是利用计算机语言的函数库提供的随机数发生器。典型情况下,它会输出一个均匀分布在0和1区间内的伪随机变量的值。其中应用的最为广泛、研究最彻底的一个算法即线性同余法。

网管网www_bitscn_com



  线性同余法LCG(Linear Congruence Generator)

  选取足够大的正整数M和任意自然数n0,a,b,由递推公式:

ni+1=(af(ni)+b)mod M i=0,1,…,M-1

  生成的数值序列称为是同余序列。当函数f(n)为线性函数时,即得到线性同余序列:

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
}

  其中种子参数seed可以任意选择,常常将它设为计算机当前的日期或者时间;m是一个较大数,可以把它取为2w,w是计算机的字长;a可以是0.01w和0.99w之间的任何整数。

  应用递推公式产生均匀分布随机数时,式中参数n0,a,b,M的选取十分重要。 网管网www_bitscn_com

  例如,选取M=10,a=b =n0=7,生成的随机序列为{6,9,0,7,6,9,……},周期为4。

  取M=16,a=5,b =3,n0=7,生成的随机序列为{6,1,8,11,10,5,12,15,14,9,0,3,2,13,4,7,6,1……},周期为16。

  取M=8,a=5,b =1,n0=1,生成的随机序列为{6,7,4,5,2,3,0,1,6,7……},周期为8。

   Visual C++中伪随机数生成机制

  用VC产生随机数有两个函数,分别为rand(void)和srand(seed)。rand()产生的随机整数是在0~RAND_MAX之间平均分布的,RAND_MAX是一个常量(定义为:#define RAND_MAX 0x7fff)。它是short型数据的最大值,如果要产生一个浮点型的随机数,可以将rand()/1000.0,这样就得到一个0~32.767之间平均分布的随机浮点数。如果要使得范围大一点,那么可以通过产生几个随机数的线性组合来实现任意范围内的平均分布的随机数。

  其用法是先调用srand函数,如

srand( (unsigned)time( NULL ) )

  这样可以使得每次产生的随机数序列不同。如果计算伪随机序列的初始数值(称为种子)相同,则计算出来的伪随机序列就是完全相同的。要解决这个问题,需要在每次产生随机序列前,先指定不同的种子,这样计算出来的随机序列就不会完全相同了。以time函数值(即当前时间)作为种子数,因为两次调用rand函数的时间通常是不同的,这样就可以保证随机性了。也可以使用srand函数来人为指定种子数。 中国网管联盟bitsCN.com
分析以下两个程序段,

  程序段1:

//包含头文件
void main() {
  int count=0;
  for (int i=0;i <10;i++){
   srand((unsigned)time(NULL));
   count++;
   cout <<"No"<<count<<"="<<rand()<<" ";
   if (!(count%5)) cout <<endl;
  }
}

  程序段2:

//包含头文件
void main() {
  int count=0;
  srand((unsigned)time(NULL));
  for (int i=0;i <10;i++){
   count++;
   cout <<"No"<<count<<"="<<rand()<<" ";
   if (!(count%5)) cout <<endl;
  }
}

  程序段1的运行结果为:

No1=9694 No2=9694 No3=9694 No4=9694 No5=9694

网管u家u.bitsCN.com


No6=9694 No7=9694 No8=9694 No9=9694 No10=9694

  程序段2的运行结果为:

No1=10351 No2=444 No3=11351 No4=3074 No5=21497
No6=30426 No7=6246 No8=24614 No9=22089 No10=21498


 

网管下载dl.bitscn.com

网管联盟bitsCN_com


上一页12 下一页
TAGs
 上一篇:C语言的常用库函数使用方法分析及用途   下一篇:VC++开发的应用技巧三则放送
相关文章列表
在VC++中生成伪随机数祥解 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
1.基于Visual C++的Winsock API
2.入门基础-VC网络编程入门
3.用VC开发IE浏览器插件:IE Toolbar
4.VC++.NET中定义和使用MFC DLL
5.C++中对浮点数的格式化显示
6.VC++技术内幕(第四版)笔记
7.COM和.NET的互操作
8.在VC++应用程序中读取文本数据
9.在VC++中生成伪随机数祥解
10.最常见的20种VC++编译错误信息集合
最新推荐文章:
1.介绍VC6.0的18个实用小技巧
2..Net下进程外COM服务器的实现
3.用VC 6.0实现串行通信的三种方法
4.基于VC.NET的GDI+编程之CImage
5.在MFC下如何定义全局变量和全局函数
6.Visual C++制作一个Sniffer实例
7.VC++环境下浮动工具条的编程
8.Microsoft .NET Compact Framework 数据
9.VC.NET的Direct3D极速入门宝典
10.VC++.NET中定义和使用MFC DLL
网管论坛交流:
·不疯魔不成活
·令你大开眼界的真正标准化机房,已整理重
·华为HCSE OSPF路由协议培训教材 V3.0
·为赈灾,女孩舍身拍“裸照”
·Windows Server 2003服务器群集创建和配
·exchange2k3全套官方资料
·双儿一周岁了。。。特殊的礼物来啦。。
·存储备份技术版块守则
·无盘技术交流区守则
·DOS命令基础大全之命令详解<作者吐血