调试环境:win10+vs2015
在编程中我们经常需要使用随机数用来进行测试,因此就需要使用到rand()函数,这里就来详解一下C语言随机数生成器。
rand()函数的原型是:int rand ( void );
该函数不需要传参,返回一个伪随机整数范围在0到RAND_MAX
在vs2015中,RAND_MAX的定义为:
#define RAND_MAX 0x7fff
也就是十进制的32767
在rand()函数中内部是去找srand()函数,经过一个算法生成随机数。
那么我们就需要了解一下srand()函数了
srand():初始化随机数发生器
srand()的函数原型:void srand(unsigned int _Seed);
该函数需要传入一个无符号的整形参数,没有返回值
总体上的意思就是:
给srand()函数传一个参数,作为rand()函数的种子,rand()函数用这个种子经过一个算法生成一个0到RAND_MAX的随机数,但是这样问题就来了,该算法是定死了的,也就是说给srand()函数传的参数如果相同的话就会产生相同的随机数,这样的随机数称之为伪随机数。如果要每次得到的随机数都不一样就需要换一个种子,所以我们就需要使用time()函数,将现在的时间毫秒值作为种子,因为毫秒单位时间变化比较快,所以这样可以将数做的更随机。
time():时间函数
time()函数原型:time_t time ( time_t * timer );
传入一个time_t指针类型的参数,返回一个time_t类型的值
在vs2015里面time_t的定义为
typedef long __time32_t;
typedef __time32_t time_t;
也即time_t是一个long类型的。
经测试,不管传入参数是time_t类型的指针还是NULL都会返回当前时间的毫秒值。
这样随机函数就完美实现了。
总结:首相调用time()函数获取当前时间毫秒值,再将其传入srand()函数生成种子,最后经rand()函数的算法产生一个由当前毫秒数产生的随机值。