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,所以说每次循环的时候取的系统时间都是一样的,那产生的随机数当然也就是一样的。