C语言随机数的产生

来源:互联网 发布:辐射4enb画质优化补丁 编辑:程序博客网 时间:2024/05/02 00:28

调试环境: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()函数的算法产生一个由当前毫秒数产生的随机值。

1 0
原创粉丝点击