strand(time(null)) 在C语言中 为什么可以 随机化数种子 原形是什么
在C语言中获取随机数的函数是rand();
一个合格的随机数值必须由获取到的值足够散列,以及值不可预知的特性,但如果不做任何处理直接调用rand(),那么得到的值是固定的。下面是一个例子:
#include <stdio.h>
#include <stdlib.h>
int main()
{
for(i = 0; i < 10; i ++)
printf("%d\n", rand());//获取10次随机数并打印。
return 0;
}
运行这个程序,看起来没什么问题,因为获取到的10个数字都是散列的,很有随机数的感觉。但重复运行这个程序就会发现,每次运行得到的十个数都是同样的,这个并不符合不可预知的特性。
所以C语言中的随机数函数rand()被称为伪随机数。
通过srand函数,可以让这个伪随机数更“真”一些,它的原理是设置一个随机数种子,然后后续的随机数依赖于种子值。
#include <stdio.h>
#include <stdlib.h>
int main()
{
for(i = 0; i < 100000; i += 10000)
{
srand(i);
printf("%d\n", rand());//获取10次随机数并打印。
}
return 0;
}
反复运行这个程序,会发现,相同的随机数种子获取到的随机数值同样是相同的。这样这个随机数种子值又不能是固定值了,于是需要想办法让这个种子值有变化。
让这个值有变化的方法有很多种,最常用的就是通过时间函数time()。这个函数是获取当前时间值的,单位是毫秒。通常的调用方式是time(NULL);
用这个值来做随机数种子可以让每次调用得到的种子值不同,因为要达到完全相同的效果,必须要在毫秒级的相同时间下同时执行,这个概率太低了。
于是time(NULL)就成了最常用的随机数种子。
以上就是srand(time(NULL)); 经常放在随机数发生前作为随机数种子的原因了。
time(null) -- 实参,取当前时间函数。
由于每次初始化时“当前时间”不同,这就保证获得的种子也不同,随机性更好。
srand(time(null))利用时间设置随机种子产生随机数
更具体的介绍 参考以下内容http://hi.baidu.com/douyuan516/blog/item/a424262a7527bff0e6cd400c.html
参考资料: http://hi.baidu.com/douyuan516/blog/item/a424262a7527bff0e6cd400c.html