rand, srand 剖析

首先,看看典型的随机数函数的实现:

static unsigned int g_seed = 0;

void srand(int seed) {
g_seed = seed;
}

int rand() {
g_seed = 214013 * g_seed + 2531011;
return g_seed ^ g_seed >> 15
}

srand()用来初始化产生随机数的种子,如果不用srand()初始化,则会自动采用默认的种子。每一次调用rand(),该函数都会根据当前的种子来产生一个数,并且会相应的修改g_seed。

通常,为了使得程序每次运行的时候产生的随机数不同,可以用系统时间来作为种子(单位精度为1s)。如下例:

srand((unsigned)time(NULL));
for (i=0; i<5; i++)
    cout<<rand()%10<<endl;

但是如果把srand放到for里边会发生什么情况呢?

会发现产生的5个随机数都是一样的。原因是:每一次循环的时候,都会设置当前的系统时间为产生随机数的种子,而time(NULL)的精度为1s,所以说每次循环的时候取的系统时间都是一样的,那产生的随机数当然也就是一样的。

 

 

posted @ 2012-08-06 20:45  菜鸟的世界  阅读(200)  评论(0编辑  收藏  举报