日期和时间
C++继承了C用于日期和时间操作的结构和函数
使用时需要引用 < ctime > 头文件
这里介绍一个比较重要的自带结构体tm:
struct tm {
int tm_sec; //秒,正常范围从0到59,但是允许至61
int tm_min; //分,范围从0到59
int tm_hour; //小时,范围从0到23
int tm_mday; //一月中的第几天,范围从1到31
int tm_mon; //月,范围从0到11
int tm_year; //自1900年起的年数
int tm_wday; //一周中的第几天,范围从0到6
int tm_yday; //一年中的第几天,范围从0到365,从1月1日算起
int tm_isdst; //夏令时
};
下面介绍C++中关于日期时间的重要函数:
函数 | 描述 |
---|---|
time_t time(time_t *time) | 返回系统的动迁时间,自1970年1月1日以来经过的秒数 |
char *ctime(const time_t *time) | 返回一个表示当地时间的字符串指针 |
struct tm *localtime(const timie_t *time) | 返回一个指向本地时间的tm结构的指针 |
clock_t clock(void) | 返回程序执行起,处理器时钟所使用的时间 |
char * asctime(const struct tm * time) | 反水一个指向字符串的指针,字符串包含time所指向结构体中储存的类型 |
struct tm *gmtime(const time_t *time) | 返回一个指向time的指针,格里尼治标准时间 |
time_t mktime(struct tm *time) | 返回日历时间 |
double difftime(time_t time2,time_t time 1) | 返回time1和time2之间相差的秒数 |
size_t strftime() | 格式化日期和时间为指定格式 |
下面就给出一个获取当地系统日期和时间的程序,包括本地时间和标准时间:
#include<iostream>
#include<ctime>
using namespace std;
int main()
{
//基于当前系统的当前时间
time_t now=time(0);
//把now转换为字符串类型
char *dt=ctime(&now);
cout<<"本地日期和时间: "<<dt<<endl;
//把now转换为tm结构
tm *gmtm=gmtime(&now);
dt=asctime(gmtm);
cout<<"UTC日期和时间: "<<dt<<endl;
return 0;
}
本地日期和时间: Wed Dec 11 14:59:14 2019
UTC日期和时间: Wed Dec 11 06:59:14 2019
随机数生成
C++中有专门的随机数生成器
#include<cstdlib>
int rand();
于是我们激动地实验了一下这个函数
发现了一个严肃的问题:为什么每次“随机”出来的数都是一样的呢???
这就引发我们思考另一个很重要地问题:
计算机可以产生真正的随机数嘛?
很遗憾,不行。。。
所谓的随机数,实际上是事先存储在计算机内部的一个数表
为了使取出来的数可视为随机,我们需要给计算机一个种子
根据种子为基准以某个递推公式推算出一系列数,因为其周期长,故在一定范围内可以看成是随机数
怎么设置种子
我们需要在使用随机数生成函数之前调用一次:
void srand(unsigned int seed);
通过设置seed来产生不同的随机数,只要种子不同,那么通过rand()得到的随机数序列就是不同的;反之,如果种子是一样的,那么通过rand()得到的随机数序列就是相同的
那么我们如何选择种子就显得无比重要
一般的,我们就选择time(0)
#include<cstdlib>
#include<ctime>
srand(static_cast<unsigned int>(time(0)));
rand();
最后我们给出去[a,b]之间的随机数公式:
rand()%(b-a+1)+a