time(NULL)與GetLocalTime獲取當前時間
到#inlcude <time.h>標頭檔案裡的一個time()函式和localtime()函式
函式原型: time_t time(time_t *timer)
函式用途: 得到機器的日曆時間或者設定日曆時間
頭 文 件: time.h
輸入引數: timer:=NULL時,得到機器日曆時間,=時間數值時 用於設定日曆時間;
time_t是一個long型別
函式原型: struct tm *localtime(const time_t *timer)
函式用途: 返回一個以tm結構表達的機器時間資訊
頭 文 件: time.h
輸入引數: timer:使用time()函式獲得的機器時間;
結構tm的定義為:
struct tm
{
int tm_sec; /* Seconds: 0-59 (K&R says 0-61?) */
int tm_min; /* Minutes: 0-59 */
int tm_hour; /* Hours since midnight: 0-23 */
int tm_mday; /* Day of the month: 1-31 */
int tm_mon; /* Months *since* january: 0-11 */
int tm_year; /* Years since 1900 */
int tm_wday; /* Days since Sunday (0-6) */
int tm_yday; /* Days since Jan. 1: 0-365 */
int tm_isdst; /* +1 Daylight Savings Time, 0 No DST,
* -1 don't know */
};
舉個例子:
#include "stdafx.h"
#include <time.h>
#include <stdio.h>
#include <wtypes.h>
int main(int argc, char* argv[])
{
time_t t;
tm *tp;
t=time(NULL);
// 既然time_t實際上是長整型,到未來的某一天,從一個時間點(一般是1970年1月1日0時0分0秒)
// 到那時的秒數(即日曆時間)超出了長整形所能表示的數的範圍怎麼辦?對time_t資料型別的值來說,
// 它所表示的時間不能晚於2038年1月18日19時14分07秒。為了能夠表示更久遠的時間,一些編譯器廠商
// 引入了64位甚至更長的整形數來儲存日曆時間。比如微軟在Visual C++中採用了__time64_t資料型別來
// 儲存日曆時間,並通過_time64()函式來獲得日曆時間(而不是通過使用32位字的time()函式),這樣
// 就可以通過該資料型別儲存3001年1月1日0時0分0秒(不包括該時間點)之前的時間。
tp=localtime(&t);
printf("%d/%d/%d/n",tp->tm_mon+1,tp->tm_mday,tp->tm_year+1900);
printf("%d:%d:%d/n",tp->tm_hour,tp->tm_min,tp->tm_sec);
SYSTEMTIME stCurTime = {0};
::GetLocalTime(&stCurTime);
// 注意區分GetSystemTime(&stCurTime);的區別
printf("%d/%d/%d/n",stCurTime.wMonth,stCurTime.wDay,stCurTime.wYear);
printf("%d:%d:%d/n",stCurTime.wHour,stCurTime.wMinute,stCurTime.wSecond);
return 0;
}
產生一定範圍隨機數的通用表示公式
要取得[a,b)的隨機整數,使用(rand() % (b-a))+ a (結果值含a不含b)。
要取得[a,b]的隨機整數,使用(rand() % (b-a+1))+ a (結果值含a和b)。
要取得(a,b]的隨機整數,使用(rand() % (b-a))+ a + 1 (結果值不含a含b)。
(總的來說,通用公式:a + rand() % n ;其中的a是起始值,n是整數的範圍)
要取得a到b之間的隨機整數,另一種表示:a + (int)b * rand() / (RAND_MAX + 1)。
要取得0~1之間的浮點數,可以使用rand() / double(RAND_MAX)。
產生相同的隨機數的原因
計算機的隨機數都是由偽隨機數,即是由小M多項式序列生成的,其中產生每個小序列都有一個初始值,即隨機種子。(注意: 小M多項式序列的週期是65535,即每次利用一個隨機種子生成的隨機數的週期是65535,當你取得65535個隨機數後它們又重複出現了。)
我們知道rand()函式可以用來產生隨機數,但是這不是真真意義上的隨機數,是一個偽隨機數,是根據一個數(我們可以稱它為種子)為基準以某個遞推公式推算出來的一系列數,當這系列數很大的時候,就符合正態公佈,從而相當於產生了隨機數,但這不是真正的隨機數,當計算機正常開機後,這個種子的值是定了的,除非你破壞了系統。
定義函式:time_t mktime(strcut tm * timeptr);
函式說明:mktime()用來將引數timeptr 所指的tm 結構資料轉換成從公元1970 年1 月1 日0 時0 分0 秒算起至今的UTC 時間所經過的秒數。
返回值:返回經過的秒數。
localtime是直接返回strcut tm*指標(如果成功的話);這個指標是指向一個靜態變數的;因此,返回的指標所指向的靜態變數有可能被其他地方呼叫的localtime改掉,例如多執行緒使用的時候。
localtime_r則是由呼叫者在第二個引數傳入一個struct tm result指標,該函式會把結果填充到這個傳入的指標所指記憶體裡面;成功的返回值指標也就是struct tm result。
其他的時間函式,如asctime,asctime_r;ctime,ctime_r;gmtime,gmtime_r都是類似的,所以,時間函式的 _r 版本都是執行緒安全的。