目录
C语?提供了库函数rand,可以用于生成随机数
CPlusPlus中关于该函数的介绍 → ?rand - C++ 参考 (cplusplus.com)
函数原型:int rand (void);
头文件:stdlib.h
返回值的范围:0~RAND_MAX(?部分编译器上是32767)
注意:rand()函数生成的随机值是伪随机值,其原理是根据一个“种子”按照某种算法所得,?次运?中产?的多个结果是相对随机的,但是程序多次运行时,结果是完全相同的
?
#include<stdio.h>
#include<stdlib.h>
int main()
{
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
从上图运行结果可以看出,在一次程序执行多次调用时确实产生了随机数的效果,但是两次运行程序产生的随机数确实完全一样的
所以单靠rand()函数无法实现真正的随机数生成
C语?中提供了库函数函数srand(),?来初始化随机数的?成器
CPlusPlus中关于该函数的介绍 →?srand - C++ Reference (cplusplus.com)
srand的原型: void srand (unsigned int seed);
头文件:stdlib.h
参数: unsigned int类型的seed参数(种子)——在程序中我们?般是使用程序与运行的时间作为种子的,因为时间时刻在发生变化的
说明:程序中在调?rand()函数之前先调?srand()函数,通过srand()函数的参数seed来设置rand()函数?成随 机数的时候的种子,只要种子在变化,每次?成的随机数序列也就变化起来——srand函数是不需要频繁调?的,一次运行的程序中调用一次就可以
这里的种子需要的随机数,我们通过下面的time函数来产生
C语?中提供了库函数time(),可以获得这个时间
CPlusPlus中关于该函数的介绍 →time - C++ Reference (cplusplus.com)
time函数原型 : time_t time (time_t* timer);
头文件: time.h
返回值:time_t类型,本质上是32位或者64位的整型类型(time函数会返回当前的日历时间,其实返回的是1970年1月1日0时0分0秒到现在程序运?时间之间的 差值,单位是秒)
注意: ?time函数的参数timer,如果是?NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存 中带回去。 如果timer是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳。
总结——最终,我们可以先使用 ?srand((unsigned int)time(NULL)); ?——使用time函数的返回值作为srand函数的参数,调用srand()函数就可以初始化种子
接下来,再调用rand()函数的时候得到的就是一个真正的随机值(再次声明,srand函数是不需要频繁调?的,一次运行的程序中调用一次就可以)
接下来实现代码 测试运行一下
#include<stdio.h>
#include<stdlib.h> //rand和srand函数头文件
#include<time.h> //time函数头文件
int main()
{
srand((unsigned int)time(NULL));//使用time函数返回的时间戳作为srand函数的参数,产生rand函数的种子
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
可以看到,单次运行中多次调用rand函数产生的随机数都是不同的,并且多次执行程序得到的随机数也是完全不同的,到此,已经实现了一定意义上的随机数