c:rand()和time函数

  • rand

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

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的正向最大值。
其中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.h
time_t time(time_t *) : time.h

返回从Unix元年(1970年1月1日0点)到当前时间所经过的秒数.

日历时间,即机器时,1970年之后的秒数

UTC,GMT,世界标准时间(经度0),中国是UTC+8

epoch:时间点,当前机器时

clock tick:时钟计时单元,一个时钟计时单元的时间长短是由CPU控制的。一个clock tick不是CPU的一个时钟周期,而是C/C++的一个基本计时单位(单位为毫秒)

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范围内。