随机数 srand() & rand()
想要计算机产生一个随机数可不像我们扔色子一样简单,计算机执行的每一步操作,说白了就是执行一堆代码,这些代码是事先被安排好的,所以计算机的产生行为是不具有随机性和预测性的(除非有一天计算机的结构不再是现在的体系结构,而是下一代的体系),可想而知计算机所产生的随机数都不是真正意义上的随机数,只是伪随机数。
要产生一个伪随机数,只能通过一定的算法来实现了,于是又了rand()函数,他可以产生一个伪随机数,但是你会发现,同一个程序被执行了N次后,每一次执行所产生的随机数都是一样的!原因很简单,前面说过,计算机只能通过一定的算法来达到随机的目的,rand()函数也是,有一个“基数”来产生相应的随机数,每一个基数“对应”一个伪随机序列,所以如果程序每次执行时rand()函数的基数都一样,那么产生的伪随机数当然就一样了!那么怎么解决这个问题呢,很简单,每次程序执行时,为rand()函数分配不同的基数就可以了!
于是又有了srand()函数,我们通常这样写:srand(unsigned(time(NULL))); 它的返回值为从 00:00:00 GMT, January 1, 1970 到现在所持续的秒数,然后将time_t型数据转化为(unsigned)型在传给srand函数,即: srand((unsigned) time(&t)); 每次执行程序时,他的返回值肯定是不一样的,这就达到了随机的效果。
还有一个小问题要注意:最好在主程序执行时,执行一次srand(unsigned(time(NULL)))就行了,原因很简单,看个例子:
int a[100];
for(int i=0;i<100;++i)
{
srand(unsigned(time(NULL)));
a[i]=rand()%100;
}
执行结束后,会发现所有的a[i]是一样的!原因就在于这段代码总共执行不到1s,而srand()返回是以秒为单位的,所以每次做种时种子是一样的!于是就出现了上述状况,故srand(unsigned(time(NULL)))只要放在程序开头就好了。