实现C语言中srand()和rand()函数
srand()和rand()的源代码
void __cdecl srand(unsigned int seed)
{_getptd()->_holdrand = (unsigned long)seed;
}int __cdecl rand(void)
{_ptiddata ptd = _getptd();return (((ptd->_holdrand = ptd->_holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
}
分析机制:
rand()函数每次都是根据seed来计算出随机数,seed在默认情况下是1,每次调用rand()函数会执行seed = seed * 214013L + 2531011L;
srand()函数作用就是修改seed;
自己实现的my_srand(),my_rand()
static unsigned long seed_next = 1; // 静态全局变量,作为种子void my_srand(unsigned long seed) // 通过传不同的参数更改种子值,一般传time(NULL)
{seed_next = seed;
}int my_rand(void) // 将srand更改过的种子值通过公式计算出结果作为随机值
{seed_next = seed_next * 214013L + 2531011L;return ((seed_next >> 16) & 0x7fff);
补充应用
time_t time(time_t *seconds) 返回自纪元 Epoch(1970-01-01 00:00:00 UTC)起经过的时间,以秒为单位。如果 seconds 不为空,则返回值也存储在变量 seconds 中。
time_t t;/* 初始化随机数发生器 */srand((unsigned) time(&t));