之前在一些代码的测试上面偶尔会出现不用srand()设置种子的,也有不理解srand()用来干什么的。
虽然不用srand()设置种子程序也可以运行,看起来也貌似是正确的。
但是实际上我们不难发现如果用rand()直接生成的数列,是有规律的。
我们以rand()%10+1(也就是本周的作业)来说明这个问题。
我写一个简单的程序,来说明这个问题。运行环境是gcc 4.9 CLion 2016.2 for Windows (Windows 10家庭中文版64位)
[code lang=”c”]
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i;
for (i = 0; i < 10; i++) {
printf("i[%d]=%d\n",i,rand()%10+1);
}
return 0;
}
[/code]
事实上,我们运行以后的结果永远是固定的。
这也就是为什么我们要用srand()的原因。让rand()随机是很重要的。我们不妨看一下rand()的定义。
The C library function int rand(void) returns a pseudo-random number in the range of 0 to RAND_MAX.
RAND_MAX is a constant whose default value may vary between implementations but it is granted to be at least 32767.
引用:https://www.tutorialspoint.com/c_standard_library/c_function_rand.htm
而在另一篇文章中关于srand()的作用则是这样解释的。
(引用自学步园-Srand函数)
比如VC中对于rand()函数是如下实现的:
int __cdecl rand (void)
{ return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff); }
————————————————————————-
而srand()的函数是如下实现的:
void __cdecl srand (unsigned int seed)
{
#ifdef _MT
_getptd()->_holdrand = (unsigned long)seed;
#else /* _MT */
holdrand = (long)seed;
#endif /* _MT */
}