srand((unsigned)time(NULL))函数

王子伟 发表于2018年02月27日
<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;在头文件&lt;stdlib.h&gt;中声明的函数rand()是随机数发生器函数,每次调用rand()函数,它都会返回一个随机整数。<br >&nbsp; &nbsp; &nbsp; &nbsp; rand()函数使用的是一个起始的种子值生成一系列的数字,实际上,计算机并不是产生真正的随机数,而是已经编写好的一些无规则排列的数字存储在电脑里,把这些数字划分成若干相等的N份,并为每份加上一个编号,通过调用srand()函数来获取这个编号(srand函数下面会讲解),然后rand()函数就按照这个编号顺序调用这一部分的随机整数。<br >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;stdlib.h&gt;也提供了另外一个标准函数srand(),叫做随机数发生器的初始函数,原型是:void srand(unsigned seed);<br >&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;如前面介绍的一样,它的作用是初始化一个种子,为rand()提供一个种子,供其获取该种子之下的随机整数。例如:srand(1),直接使用1来初始化种子,不过为了防止随机数每次重复,常常使用系统时间来初始化。<br >&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;在&lt;time.h&gt;头文件中声明的函数time(),time()函数会将自1970年1月1日起至今的总秒数返回为一个整数,因为时间永不停歇,然后将time_t型数据转化为unsigned型再传递给srand函数,time()函数需要一个参数NULL,NULL是在&lt;stdlib.h&gt;中定义的符号。表示不引用任何内容。所以srand()为rand()函数获取的种子是一直在变的,rand()函数取得的随机数也不相同。<br >&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;只要用户或者第三方不设置随机种子,在默认情况下随机种子来自系统时钟,如果想在一个程序中生成随机数序列。需要至多在生成随机数之前设置一次随机数种子。即:只需在主程序开始处调用srand((unsigned)time(NULL));后面直接调用rand()就可以了。不要在for等循环中放置srand((unsigned)time(NULL));<br >程序如下:<br >&nbsp;void test_rand(void)<br >&nbsp;&nbsp;{<br >&nbsp;&nbsp;&nbsp;unsigned long n;<br >&nbsp;&nbsp;&nbsp;srand((unsigned)time(NULL));<br >&nbsp;&nbsp;&nbsp;for(int i=0;i&lt;100;i++)<br >&nbsp;&nbsp;&nbsp;{<br >&nbsp;&nbsp;&nbsp;&nbsp;n=rand();&nbsp;&nbsp;&nbsp;<br >&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;%d\t&quot;,n);<br >&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br >&nbsp;&nbsp;}</p>