中包含的标准库有两个函数帮助生成伪随机数。
函数1 (内部) void;
返回从在srand(seed )中指定的seed到[seed,rand_max )0x7fff之间的随机整数。
函数二、语音扫描(unsigned seed );
参数seed是rand (用于初始化初始值的rand ) )的种子。
rand ) )在每次调用时,可能会显示以下内容:
1 )如果用户以前调用过srand(seed )并为seed指定了值,则会自动调用
srand(seed )一次初始化其开始值。
2 )如果用户在此之前没有调用过srand(1(seed ),则自动调用一次srand)。
根据上面的第一点,可以看出。
1 ) rand ) )在每次运行程序时生成的值不同,必须对srand(seed )中的seed赋予变量,该变量在每次运行程序时必须不同) (至今为止
2 )否则,如果为seed指定一定的值,则每次运行程序时rand ) )生成的值相同。 但是,该值是在[seed,rand_max(0x7fff ) ]之间随机获取的值。
3 )如果在调用rand (之前未调用srand ) seed (),则效果与调用srand (1),然后调用rand () )相同) 1也是恒定的。
让我举几个例子。 假设获取0到6之间的随机整数(不包括6本身) :
例1、不指定seed :
for(intI=0; i10; I ) {
ran_num=rand(%6;
coutran_num ';
}
每次运行输出: 5 5 4 4 5 4 0 0 4 2
例2、将seed指定为一定值1 :
Srand(1;
for(intI=0; i10; I ) {
ran_num=rand(%6;
coutran_num ';
}
每次运行输出: 5 5 4 4 5 4 0 0 4 2
与例1的结果完全相同。
例3、将seed指定为一定值6 :
Srand(6;
for(intI=0; i10; I ) {
ran_num=rand(%6;
coutran_num ';
}
每次运行输出: 4 1 5 1 4 3 4 4 2 2
随机值也在[ 0,6 ]之间,得到的值与srand(1不同,但每次运行时结果相同。
例4、将seed指定为当前系统经过的时间(秒):time_ttime(0) :
#包含
//…
srand () unsigned (time (0) )0);
for(intI=0; i10; I ) {
ran_num=rand(%6;
coutran_num ';
}
首次运行时输出:0 1 5 4 5 0 2 3 4 2
第二次:3 2 3 0 3 5 5 2 2 3
无论如何,启动程序的时间每次都不同,所以执行结果每次都不同。 (间隔必须在1秒以上吗? 参照下面)。
关于time_ttime(0) :
time_t定义为长整数,返回从1970年1月1日零时0分0秒到当前的经过时间(以秒为单位)。 例如,输出:
计数时间(0;
值约为1169174701,约为37 (年) 365 (日) 24 (小时) 3600 (秒) ) (没有计算年月日)。
此外,ran _ num=rand (对于% 6,
rand ) )的返回值和6求类型,以使所需的随机数在[ 0,6 ]之间。 否则,rand ) )的返回值本身可能会变得巨大。
一般公式如下:
若要获取[a,b]之间的随机整数,请使用(rand () () (b-a ) ) a。 结果的值包括a,不包括b。
a为0时,缩写为rand(%b )。
最后,关于伪随机浮点数:
可以使用rand ()/double ) rand_max获取0到1之间的浮点数。 (请注意,与整数表达式不同,它是除法,不是模。 )
示例:
双精度ran _ numf=0.0;
srand () unsigned (time (0) )0);
for(intI=0; i10; I ) {
ran_numf=rand(/)/(双精度) ) RAND_MAX;
coutran_numf ';
}
执行结果为0.716636、0.457725、…等10个0~1的浮点数,每次结果都不同。
在想取更大范围随机浮点数,例如1~10的情况下
rand ()/(double ) ) rand _ max (rand ) )/(double ) RAND_MAX/10 )
执行结果为7.19362、6.45775、…等10个1~10的浮点数,每次结果都不同。
对于100,1000的情况,可以这样类推。
GetTickCount函数
函数: GetTickCount返回(retrieve )操作系统从启动到当前经过的时间(elapsed )的毫秒数,返回值为DWORD。
函数原型:
dword gettickcount (语音;
随机数的生成需要随机种子。 计算机生成的随机数是用递归方法得到的,所以需要初始值,也就是通常所说的随机种子。 如果不初始化随机种子,计算机确实有节约的随机种子,每次递归都会得到结果
完全一样。 因此,每次运行程序时都必须初始化随机种子。 vc中的方法调用一个名为srand(int )的函数,其参数
数量是随机种子,但给定常数后,得到的随机序列将完全相同。 因此,可以将系统的时间用作随机种子
因为系统时间保证随机性。
调用方法为rand(gettickcount ) ),但每次调用rand ) )时不能用rand(gettickcount ) )初始化。 因为
当前计算机运行时间相对较快,连续调用rand ()时,系统时间尚未更新,因此得到的随机种子在一定时间内是完整的
一样的。 因此,通常在产生大量随机数之前,只初始化一次随机种子。