C++中的日期和時間&&隨機數生成

日期和時間

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
發佈了956 篇原創文章 · 獲贊 211 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章