目录
一、随机数的简介
C语言中提供了一个关于随机数的函数rand。其原型为
int rand (void);
1.不过rand函数生成的随机数并不是真正的随机数,而是伪随机数。rand函数生成的随机数范围在0 ~ RAND_MAX之间,此值与库相关,但至少 32767 保证在任何标准库实现上都如此。即大部分编译器给出rand函数生成的随机数的范围在0 ~ 32767之间。
2.另外,rand函数的实现还需要包含头文件<stdlib.h>
二、rand函数的弊端
在一次运行中的随机数是随机的,但在之后的运行中我们就能发现生成的随机数与先前生成的随机数值是一样的。
这是因为rand函数生成的随机数是伪随机数,伪随机数不是真正的随机数,是通过某种算法生成的随机数。真正的随机数的是无法预测下⼀个值是多少的。
而rand函数是对⼀个叫“种子”的基准值进行运算生成的随机数。这里rand的种子默认值为1。
三、解决办法(生成真正的随机数)
1.核心:让种子改变。
C语言中又提供了另一个函数srand,srand又被称为初始化随机数生成器,伪随机数生成器使用作为种子传递的参数进行初始化。
其原型为:
void srand (unsigned int seed);
这样的话只要我们每次调用rand函数前都调用srand函数初始化种子,那么就能使种子发生改变,从而生成真正的随机数。
2.那如何让种子发生改变呢
我们可以采用一个巧妙的方法,利用time函数。
time函数的原型:
time_t time (time_t* timer);
由于时间在不断发生改变,那么如果我们利用不同的时间这个值就能生成不同的种子。
1.time函数会返回当前的日历时间,其实返回的是1970年1月1日0时0分0秒到现在程序运行时间之间的差值,单位是秒。返回的类型是time_t类型的,time_t 类型本质上其实就是32位或者64位的整型类型。
2.time函数的参数 timer 如果是非NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存中带回去。
3.如果timer 是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳。
4.time函数的时候需要包含头文件:time.h
因此如果只想返回不一样的时间戳生成随机数,我们可以这么写:
srand((unsigned int)time(NULL));
这时候调用rand函数就会真正生成随机数了。具体代码实现如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand((unsigned int)time(NULL));
printf("%d\n", rand());
return 0;
}