前段时间做过随机数的相关题目,自以为已经对其产生机制已经了如指掌。不然又遇到问题。已经知道随即产生函数是以某个静态变量为初始值(即种子)进行运算得到的(此静态变量在被调用时会随着改变其值)。因此为了“去伪存真”,不让它每次产生的随机数都相同,我们引入了“时间种子”的概念。此时的初始值是从当前的系统时间所抽取,具体怎样实现的自己并未全部了解,因为发现英文资料有点难读,偷懒了。不过我想这正是我这次所遇到问题的核心所在。代码如下:
for()
{
srand((unsigned)time(0));
printf("%d ",rand());
}
其每次产生的随机数一样。这有点让我费解。我的本意是这样的:每次要产生随机数的时候就对其种子进行初始化,因为系统的时间是在时刻变化的,所以其产生的随机数自然是真随机的。然而实现出来的时候却让人大跌眼镜。是一样的!稍作修改,如下:
srand((unsigned)time(0));
for()
printf("%d ",rand());
这样产生的随机数反而每次均不一样(可以理解)。因此需要回去读资料再行验证。
2009.8.1
验证解答:页末的代码在运行时可以看到里面的数据是以秒为单位在不断更新的,回想上次for循环里面因为只是有限次的循环,所以只要在一秒的时间单位内其种子被初始化后的值是一样的。这主要依赖于具体的函数实现,因为时间函数time()返回的是当前的日历时间,而日历时间的结构体中最小的时间单位为秒,如下
int tm_sec; // seconds after the minute — [0, 60]
int tm_min; // minutes after the hour — [0, 59]
int tm_hour; // hours since midnight — [0, 23]
int tm_mday; // day of the month — [1, 31]
int tm_mon; // months since January — [0, 11]
int tm_year; // years since 1900
int tm_wday; // days since Sunday — [0, 6]
int tm_yday; // days since January 1 — [0, 365]
int tm_isdst; // Daylight Saving Time flag
for(;;)
{
srand((unsigned)time(0));
printf("%d",rand());
}