日期和時間
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