srand((unsigned)time(NULL))以及rand()函数的使用及理解

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 }   

 

    这是运行结果:

srand((unsigned)time(NULL))以及rand()函数的使用及理解_第1张图片

   产生是全是0-32767之间的数。。。。。。

 

   不过这样使用这个函数从严格意义上来说不是随机的,只是在某种规则下随机。

   例如我第二次在运行此函数:

   srand((unsigned)time(NULL))以及rand()函数的使用及理解_第2张图片

   你会发现每次运行数组得到的值完全一样,只是数组内的数值随机了。

   如果你确定一个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>则程序运行的结果如下:

    第一次:

    srand((unsigned)time(NULL))以及rand()函数的使用及理解_第3张图片

    第二次:

    

    这样我们每次运行得到的就是不同的值了。

你可能感兴趣的:(null)