1.首先说说rand()函数
rand()函数相当于一个随机数字生成器,生成数字的大小范围是0-32767(先前没有调用srand(seed))。
那么为什么范围会是0-32767呢?
0:在使用rand()函数之前没有调用srand(seed),则系统会默认调用srand(0),而srand(seed)函数中的seed可以理解为随机数的最小值。
32767:这个数值大小换为十六进制即为0x7fff,这个数被定义在<stdlib.h>这个头文件中,定义宏:#define RAND_MAX 0x7fff。
就是说rand()随机值得最大值被固定为32767(注意:这个数不是2^16-1,不是65536,不是二个字节能表示的最大值)
也就是说使用rand()函数必须包含头文件<stdlib.h>.
2.再来说说srand(seed);
srand(seed)相当于是rand()使用前的声明,当然你不声明系统会默认给你声明,seed就是生成随机数的最小值。
下面是一段实例代码:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main() 5 { 6 int a[10],i = 0; 7 srand(0); 8 for(;i < 10;i++) 9 { 10 a[i] = rand(); 11 printf("%d,",a[i]); 12 } 13 }
这是运行结果:
产生是全是0-32767之间的数。。。。。。
不过这样使用这个函数从严格意义上来说不是随机的,只是在某种规则下随机。
例如我第二次在运行此函数:
你会发现每次运行数组得到的值完全一样,只是数组内的数值随机了。
如果你确定一个seed值,比如上面代码中的0,你每次运行程序的随机值会一模一样,即我第二次运行上述程序,得到的随机值会和第一次运行得到的随机值一摸一样。
那如何做到真正的获取随机值呢?那么就必须每次运行程序的srand(seed)中的seed值不同,那么得到的数组值也就不同,也就实现了真正的随机数。
这个就要用到time这个函数了。
3.声明srand((unsigned)time(NULL))来实现真正的随机
首先time()函数是用来获取从1970年1月1日零时零分零秒到目前为止所经过的时间,单位为秒,包含在头文件<time.h>中
因为时间是不断流逝的,所以使用这个函数来当做seed的值,那么每次seed的值不同,rand()也就是真正的随机了。
因为我们不需要参数来记录传递值,所以一般使用time(NULL),并且强制转化为unsigned类型。
也就成了srand((unsigned)time(NULL)).......................
将上面的代码中srand(0)改为srand((unsigned)time(NULL)),并加上头文件<time.h>则程序运行的结果如下:
第一次:
第二次:
这样我们每次运行得到的就是不同的值了。