对C语言随机数函数rand的一些理解

int rand(void) : stdlib.h
返回[0,RAND_MAX]范围的整数,ANSI C只规定了函数rand的返回值类型(即int)和返回值上界(即RAND_MAX),也就是说,任何一个具体的实现,只要RAND_MAX不超过其所在平台int的正向最大值都是允许的(不然返回值发生溢出),例如,
在VC++2010和MinGW GCC TDM 5.1 32bit中,RAND_MAX=32767=0x7FFF,即short int的正向最大值
在CentOS 7的GCC 4.8.2 x86_64中,RAND_MAX=2147483647=0x7FFFFFFF,即其int的正向最大值
PS:RAND_MAX这个宏定义位于stdlib.h中

在rand函数内,维护着一个计数器,每次调用rand函数都会使计数器+1,然后计数器与种子发生运算,返回[0,RAND_MAX]中的一个整数,这也导致了每次运行相同的rand函数总是返回相同的值,如,
int i;
for (i=0;i<10;i++){
printf("%d\n",rand());

}
每次运行,得到的10个随机数都相同。

void srand(unsigned int) : stdlib.h
依据传入的无符号整数,来设置对应的随机数种子,这个随机数种子是全局的变量,能够被rand函数读取,能够被srand函数修改。

time_t time(time_t *) : time.h
返回从Unix元年(1970年1月1日0点)到当前时间所经过的秒数,
typedef __time64_t time_t; : types.h
typedef __int64 __time64_t; : types.h
#define __int64 long long : _mingw.h
time函数获取秒数有两种方式,
1.直接通过函数的返回值获取秒数,
2.通过传入一个time_t类型的地址,函数会将秒数也保存到这个地址上,
当传入的指针是NULL或0时,函数只通过返回值返回秒数。

由于秒数总是在向前变化,所以可以利用time函数的返回值来作为srand的传入参数。
在写这篇文章时,time(0)返回的值是1583975156,在unsigned int范围内。

PS:rand函数使用线性同余法实现随机数,是伪随机数,由于周期较长(至少是32767),因此在一定范围内可以看成是随机的。

猜你喜欢

转载自www.cnblogs.com/ryzz/p/12467291.html