龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

使用VC++开发考场随机排座系统[组图](3)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
3.2随机数的产生 随机数的产生需要一个随机的种子,而计算机产生的随机数是通过递推的方法得到的,必须有一个初始值,也就是通常所说的随机种子,

  3.2随机数的产生

   随机数的产生需要一个随机的种子,而计算机产生的随机数是通过递推的方法得到的,必须有一个初始值,也就是通常所说的随机种子,如果不对随机种子进行初始化,那么计算机有一个缺省的随机种子,这样每次产生的随机数序列结果就会完全相同,在VC系统中,随机种子的初始化是通过srand(int)函数进行的,但是如果给定的参数是一个常量,则每次得到的随机数序列也会完全相同,即使是使用系统时间作为随机种子进行初始化srand(GetTickCount()),又不能在每次调用rand()的时候都进行这项操作,因为现在计算机上运行速度比较快,当连续调用rand()函数时,系统的时间还没有更新,这也不足以保证产生随机数序列的真正随机性。

   本系统采用了对产生的随机数序列进行筛选的方法,使得产生的随机数序列符合一维正态分布的概率密度函数规律,其原理为:若一个数列服从一维正态分布,那么它的概率密度函数为(其中,为常数,分别代表数学期望和方差[3]),根据一维正态分布的概率密度理论为随机数序列的均值,代表着随机数在该处的概率最大,为方差,代表产生的随机数偏离均值的程度,其概率密度函数曲线如图1所示,利用rand()函数线性变换后产生的平均随机数,带入该函数模型进行验证,若随机数的函数值在曲线范围内,即认为该随机数符合条件,进行保留,反之,舍弃;基于该方法产生的10000个随机数序列的统计如图2所示,从图2可以看出随机数序列符合一维正态分布的规律,达到系统所需的随机数要求。

   产生随机数的核心代码如下:

//产生有四位小数的min和max之间的一个随机数

double CRandomGen::AverageRandom(double min, double max)

{

       int minInteger = (int)(min*10000);

       int maxInteger = (int)(max*10000);

       int randInteger = rand()*rand();

       int diffInteger = maxInteger - minInteger;

       int resultInteger = randInteger % diffInteger + minInteger;

       return resultInteger/10000.0;

}

精彩图集

赞助商链接