1. 程式人生 > >c/c++中時間函數和隨機函數的總結

c/c++中時間函數和隨機函數的總結

type years errno tween rom 循環語句 see cpu linux時間

c/c++中時間函數和隨機函數的總結

*******************C++的隨機函數和時間函數************

隨機函數

一、C++中不能使用random()函數

random函數不是ANSI C標準,不能在gcc,vc等編譯器下編譯通過。 可改用C++下的rand函數來實現。

1、C++標準函數庫提供一隨機數生成器rand,返回0-RAND_MAX之間均勻分布的偽隨機整數。 RAND_MAX必須至少為32767。rand()函數不接受參數,默認以1為種子(即起始值)。 隨機數生成器總是以相同的種子開始,所以形成的偽隨機數列也相同,失去了隨機意義。(但這樣便於程序調試)

2、C++中另一函數srand(),可以指定不同的數(無符號整數變元)為種子。但是如果種子相同,偽隨機數列也相同。一個辦法是讓用戶輸入種子,但是仍然不理想。

3、 比較理想的是用變化的數,比如時間來作為隨機數生成器的種子。 time的值每時每刻都不同。所以種子不同,所以,產生的隨機數也不同。

// C++隨機函數(VC program)

#include <stdio.h>

#include <iostream>

#include <time.h>

using namespace std;

#define MAX 100

int main(int argc, char* argv[])

{

srand( (unsigned)time( NULL ) );//srand()函數產生一個以當前時間開始的隨機種子.應該放在for等循環語句前面 不然要很長時間等待

for (int i=0;i<10;i++)

cout<<rand()%MAX<<endl;//MAX為最大值,其隨機域為0~MAX-1

   return 0;

}

二、rand()的用法

rand()不需要參數,它會返回一個從0到最大隨機數的任意整數,最大隨機數的大小通常是固定的一個大整數。 這樣,如果你要產生0~10的10個整數,可以表達為:

int N = rand() % 11;

這樣,N的值就是一個0~10的隨機數,如果要產生1~10,則是這樣:

int N = 1 + rand() % 11;

總結來說,可以表示為:

a + rand() % n

其中的a是起始值,n是整數的範圍。

  a + rand() % (b-a+1) 就表示 a~b之間的一個隨機數

若要0~1的小數,則可以先取得0~10的整數,然後均除以10即可得到隨機到十分位的10個隨機小數,若要得到隨機到百分位的隨機小數,則需要先得到0~100的10個整數,然後均除以100,其它情況依

此類推。

通常rand()產生的隨機數在每次運行的時候都是與上一次相同的,這是有意這樣設計的,是為了便於程序的調試。若要產生每次不同的隨機數,可以使用srand( seed )函數進行隨機化,隨著seed的不同,就能夠產生不同的隨機數。

如大家所說,還可以包含time.h頭文件,然後使用srand(time(0))來使用當前時間使隨機數發生器隨機化,這樣就可以保證每兩次運行時可以得到不同的隨機數序列(只要兩次運行的間隔超過1秒)。

函數名: random

?功 能: 隨機數發生器

用 法: int random(int num);

程序例:

#include <stdlib.h>

#include <stdio.h>

#include <time.h>

/* prints a random number in the range 0 to 99 */

int main(void)

{

randomize();

printf("Random number in the 0-99 range: %d\n", random (100));

return 0;

}

函數名: randomize

功 能: 初始化隨機數發生器

用 法: void randomize(void);

程序例:

#include <stdlib.h>

#include <stdio.h>

#include <time.h>

int main(void)

{

int i;

randomize();

printf("Ten random numbers from 0 to 99\n\n");

for(i=0; i<10; i++)

printf("%d\n", rand() % 100);

return 0;

}

rand(產生隨機數)

相關函數

srand

表頭文件

#include<stdlib.h>

定義函數

int rand(void)

函數說明

rand()會返回一隨機數值,範圍在0至RAND_MAX 間。在調用此函數產生隨機數前,必須先利用srand()設好隨機數種子,如果未設隨機數種子,rand()在調用時會自動設隨機數種子為1。關於隨機數種子請參考srand()。

返回值

返回0至RAND_MAX之間的隨機數值,RAND_MAX定義在stdlib.h,其值為2147483647。

範例

/* 產生介於1 到10 間的隨機數值,此範例未設隨機數種子,完整的隨機數產生請參考

srand()*/

#include<stdlib.h>

main()

{

int i,j;

for(i=0;i<10;i++)

{

j=1+(int)(10.0*rand()/(RAND_MAX+1.0));

printf("%d ",j);

}

}

執行

9 4 8 8 10 2 4 8 3 6

9 4 8 8 10 2 4 8 3 6

srand(設置隨機數種子)

相關函數

rand

表頭文件

#include<stdlib.h>

定義函數

void srand (unsigned int seed);

函數說明

srand()用來設置rand()產生隨機數時的隨機數種子。參數seed必須是個整數,通常可以利用geypid()或time(0)的返回值來當做seed。如果每次seed都設相同值,rand()所產生的隨機數值每次就會一樣。

返回值 返回0至RAND_MAX之間的隨機數值,RAND_MAX定義在stdlib.h,其值為2147483647。 範例 /* 產生介於1 到10 間的隨機數值,此範例未設隨機數種子,完整的隨機數產生請參考 srand()*/ #include<stdlib.h> main() { int i,j; for(i=0;i<10;i++) { j=1+(int)(10.0*rand()/(RAND_MAX+1.0)); printf("%d ",j); } }

返回值

範例

/* 產生介於1 到10 間的隨機數值,此範例與執行結果可與rand()參照*/

#include<time.h>

#include<stdlib.h>

main()

{

int i,j;

srand((int)time(0));

for(i=0;i<10;i++)

{

j=1+(int)(10.0*rand()/(RAND_MAX+1.0));

printf(" %d ",j);

}

}

執行

5 8 8 8 10 2 10 8 9 9

2 9 7 4 10 3 2 10 8 7

在指定的兩個數之間產生隨機數

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

//返回a和b之間的隨機數,用時間做種子

int rand_between_a_b(int a,int b)

{

int c ,re,temp;

time_t t;

if(a < b)

{

temp = a;

a = b;

b = temp;

}

c = a - b;

srand((unsigned) time(&t)); //使用時間做種子數

re = b + (rand() % c);

return re;

}

int main()

{

int re;

re = rand_between_a_b(35,98);

printf("%d\n",re);

getch();

return 0;

}

註:

srand()配置隨機數種子。

srand((unsigned)time(NULL));產生偽隨機數數列

rand()產生隨機數

C庫裏的Rand函數用的是偽隨機數生成算法,你不種一個新種子進去,生成的隨機數序列都是一樣的。

偽隨機的意思就是不隨機,種子相同的情況下,等次數地獲得的“隨機”結果都是一樣的(函數嘛...)

為了讓他真隨機,就得找個現成的隨機量作初值

一般選時間作為srand的參數,也就是seed

時間函數

一、獲取日歷時間

time_t是定義在time.h中的一個類型,表示一個日歷時間,也就是從1970年1月1日0時0分0秒到此時的秒數,原型是:

typedef long time_t; /* time value */

可以看出time_t其實是一個長整型,由於長整型能表示的數值有限,因此它能表示的最遲時間是2038年1月18日19時14分07秒。

函數time可以獲取當前日歷時間時間,time的定義:

time_t time(time_t *)

#include <iostream>

#include <time.h>

using namespace std;

int main(void)

{

time_t nowtime;

nowtime = time(NULL); //獲取當前時間

cout << nowtime << endl;

return 0;

}

輸出結果:1268575163

二、獲取本地時間

time_t只是一個長整型,不符合我們的使用習慣,需要轉換成本地時間,就要用到tm結構,time.h中結構tm的原型是:

struct tm {

int tm_sec; /* seconds after the minute - [0,59] */

int tm_min; /* minutes after the hour - [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 January 1 - [0,365] */

int tm_isdst; /* daylight savings time flag */

};

可以看出,這個機構定義了年、月、日、時、分、秒、星期、當年中的某一天、夏令時。可以用這個結構很方便的顯示時間。

用localtime獲取當前系統時間,該函數將一個time_t時間轉換成tm結構表示的時間,函數原型:

struct tm * localtime(const time_t *)

使用gmtime函數獲取格林尼治時間,函數原型:

struct tm * gmtime(const time_t *)

為了方便顯示時間,定義了一個函數void dsptime(const struct tm *);

#include <iostream>

#include <time.h>

using namespace std;

void dsptime(const struct tm *); //輸出時間。

int main(void)

{

time_t nowtime;

nowtime = time(NULL); //獲取日歷時間

cout << nowtime << endl; //輸出nowtime

struct tm *local,*gm;

local=localtime(&nowtime); //獲取當前系統時間

dsptime(local);

gm=gmtime(&nowtime); //獲取格林尼治時間

dsptime(gm);

return 0;

}

void dsptime(const struct tm * ptm)

{

char *pxq[]={"日","一","二","三","四","五","六"};

cout << ptm->tm_year+1900 << "年" << ptm->tm_mon+1 << "月" << ptm->tm_mday << "日 " ;

cout << ptm->tm_hour << ":" << ptm->tm_min << ":" << ptm->tm_sec <<" " ;

cout << " 星期" <<pxq[ptm->tm_wday] << " 當年的第" << ptm->tm_yday << "天 " << endl;

}

輸出結果:

1268575163

2010年3月14日 21:59:23 星期日 當年的第72天

2010年3月14日 13:59:23 星期日 當年的第72天

三、輸出時間

C/C++語言提供了用字符串格式表示時間的函數。

char * asctime(const struct tm *)

char * ctime(const time_t *)

這兩個函數返回值都是一個表示時間的字符串,區別在於傳入的參數不同。

#include <iostream>

#include <time.h>

using namespace std;

int main(void)

{

time_t nowtime;

nowtime = time(NULL); //獲取日歷時間

cout << nowtime << endl; //輸出nowtime

struct tm *local;

local=localtime(&nowtime); //獲取當前系統時間

cout << asctime(local) ;

cout << ctime(&nowtime) ;

return 0;

}

輸出結果:

1268575163

Sun Mar 14 13:59:23 2010

Sun Mar 14 21:59:23 2010

四、計算時間間隔

可以通過difftime來計算兩個時間的間隔,可以精確到秒,函數原型:

double difftime(time_t, time_t)

要想精確到毫秒,就要使用clock函數了,函數原型:

clock_t clock(void)

從定義可以看出clock返回一個clock_t類型,這個類型也定義在time.h中,原型是:

typedef long clock_t

clock_t也是一個長整型,表示的是從程序開始運行到執行clock函數時所經過的cpu時鐘計時單元數。

輸出結果:

請按任意鍵繼續. . .

時間差:3

Clock時間差:3094

在time.h中定義了一個CLOCKS_PER_SEC

/* Clock ticks macro - ANSI version */

#define CLOCKS_PER_SEC 1000

表示1秒鐘內有多少個時鐘計時單元,在標準C/C++中,最小的計時單位是1毫秒。

五、自定義時間格式

C/C++在time.h中提供了一個自定義時間格式的函數strftime,函數原型:

size_t strftime(char *strDest, size_t maxsize, const char *format, const struct tm *timeptr);

參數說明:

char *strDest:用來存放格式化後的字符串緩存,

size_t maxsize:指定最多可以輸出的字符數,

const char *format:格式化字符串,

const struct tm *timeptr:要轉換的時間。

可使用的格式化字符串:

%a 星期幾的簡寫

%A 星期幾的全稱

%b 月分的簡寫

%B 月份的全稱

%c 標準的日期的時間串

%C 年份的後兩位數字

%d 十進制表示的每月的第幾天

%D 月/天/年

%e 在兩字符域中,十進制表示的每月的第幾天

%F 年-月-日

%g 年份的後兩位數字,使用基於周的年

%G 年分,使用基於周的年

%h 簡寫的月份名

%H 24小時制的小時

%I 12小時制的小時

%j 十進制表示的每年的第幾天

%m 十進制表示的月份

%M 十時制表示的分鐘數

%n 新行符

%p 本地的AM或PM的等價顯示

%r 12小時的時間

%R 顯示小時和分鐘:hh:mm

%S 十進制的秒數

%t 水平制表符

%T 顯示時分秒:hh:mm:ss

%u 每周的第幾天,星期一為第一天 (值從0到6,星期一為0)

%U 第年的第幾周,把星期日做為第一天(值從0到53)

%V 每年的第幾周,使用基於周的年

%w 十進制表示的星期幾(值從0到6,星期天為0)

%W 每年的第幾周,把星期一做為第一天(值從0到53)

%x 標準的日期串

%X 標準的時間串

%y 不帶世紀的十進制年份(值從0到99)

%Y 帶世紀部分的十進制年份

%z,%Z 時區名稱,如果不能得到時區名稱則返回空字符。

%% 百分號

#include <iostream>

#include <time.h>

using namespace std;

int main(void)

{

time_t nowtime;

nowtime = time(NULL); //獲取日歷時間

cout << nowtime << endl; //輸出nowtime

struct tm *local;

local=localtime(&nowtime); //獲取當前系統時間

char buf[80];

strftime(buf,80,"格式化輸出:%Y-%m-%d %H:%M:%S",local);

cout << buf << endl;

return 0;

}

輸出結果:
1268575163
格式化輸出:2010-03-14 21:59:23

***********C語言的時間函數************

Linux下c語言編程的時間函數詳解默認分類 2010-03-12 10:41:35 閱讀448

/******************

* Linux時間函數 *

******************/

asctime(將時間和日期以字符串格式表示); ===>傳入UTC(struct tm)tmp,返回char*。

ctime(將時間和日期以字符串格式表示); ===>傳入(time_t)arg,返回char*。

gettimeofday(取得目前的時間); ===>傳入(time_t)arg,返回tv,tz結構體傳入時間,時區信息。

gmtime(取得目前時間和日期); ===>傳入(time_t)arg,返回UTC(struct tm)tmp。

localtime(取得當地目前時間和日期); ===>傳入time_t,返回當地(struct tm)tmp。

mktime(將時間結構數據轉換成經過的秒數); ===>把(struct tm)tmp轉換為UTC(time_t)arg。

settimeofday(設置目前時間); ===>通過tv,tz結構體傳入時間,時區信息。

time(取得目前的時間); ===>非空參數(或返回值)接收(time_t)arg。

×××註1:char*是字符串時間格式。如:Sat Oct 28 02:10:06 2000。

×××註2:time_t是time()的返回值類型,(time_t)arg指從1970年到所指時間的秒數。

×××註3:struct tm為真實世界的表示時間方式,(struct tm)tmp是指向tm的時間。

×××註4:UTC,指標準時間。簡單的想,就是0時區的時間標準。

以下是各個函數的詳解:

_______________________________________________________________________________

asctime(將時間和日期以字符串格式表示)

相關函數 time,ctime,gmtime,localtime

表頭文件 #include<time.h>

定義函數 char * asctime(const struct tm * timeptr);

函數說明 asctime()將參數timeptr所指的tm結構中的信息轉換成真實世界所使用的時間日期表示方法,然後將結果以字符串形態返回。此函數已經由時區轉換成當地時間,字符串格式為:“Wed Jun 30 21:49:08 1993\n”

返回值 若再調用相關的時間日期函數,此字符串可能會被破壞。此函數與ctime不同處在於傳入的參數是不同的結構。

附加說明 返回一字符串表示目前當地的時間日期。

範例

#include <time.h>

int main()

{

time_t timep;

time (&timep);

printf(“%s”,asctime(gmtime(&timep)));

return 0;

}

執行

Sat Oct 28 02:10:06 2000

############################################################################## 

_______________________________________________________________________________

ctime(將時間和日期以字符串格式表示)

相關函數 time,asctime,gmtime,localtime

表頭文件 #include<time.h>

定義函數 char *ctime(const time_t *timep);

函數說明 ctime() 將參數timep所指的time_t結構中的信息轉換成真實世界所使用的時間日期表示方法,然後將結果以字符串形態返回。此函數已經由時區轉換成當地時間,字符串格式為“Wed Jun 30 21 :49 :08 1993\n”。若再調用相關的時間日期函數,此字符串可能會被破壞。

返回值 返回一字符串表示目前當地的時間日期。

範例

#include<time.h>

int main(){

time_t timep;

time (&timep);

printf(“%s”,ctime(&timep));

return 0;

}

執行

Sat Oct 28 10 : 12 : 05 2000

##############################################################################

_______________________________________________________________________________

gettimeofday(取得目前的時間)

相關函數 time,ctime,ftime,settimeofday

表頭文件 #include <sys/time.h>

& #include <unistd.h>

定義函數 int gettimeofday ( struct timeval * tv , struct timezone * tz )

函數說明 gettimeofday()會把目前的時間有tv所指的結構返回,當地時區的信息則放到tz所指的結構中。

timeval 結構定義為:

struct timeval{

long tv_sec; /*秒*/

long tv_usec; /*微秒*/

};

timezone 結構定義為:

struct timezone{

int tz_minuteswest; /*和Greenwich 時間差了多少分鐘*/

int tz_dsttime; /*日光節約時間的狀態*/

};

上述兩個結構都定義在/usr/include/sys/time.h。tz_dsttime 所代表的狀態如下

DST_NONE /*不使用*/

DST_USA /*美國*/

DST_AUST /*澳洲*/

DST_WET /*西歐*/

DST_MET /*中歐*/

DST_EET /*東歐*/

DST_CAN /*加拿大*/

DST_GB /*大不列顛*/

DST_RUM /*羅馬尼亞*/

DST_TUR /*土耳其*/

DST_AUSTALT /*澳洲(1986年以後)*/

返回值 成功則返回0,失敗返回-1,錯誤代碼存於errno。附加說明EFAULT指針tv和tz所指的內存空間超出存取權限。

範例

#include<sys/time.h>

#include<unistd.h>

int main(){

struct timeval tv;

struct timezone tz;

gettimeofday (&tv , &tz);

printf(“tv_sec; %d\n”, tv,.tv_sec) ;

printf(“tv_usec; %d\n”,tv.tv_usec);

printf(“tz_minuteswest; %d\n”, tz.tz_minuteswest);

printf(“tz_dsttime, %d\n”,tz.tz_dsttime);

return 0;

}

執行

tv_sec: 974857339

tv_usec:136996

tz_minuteswest:-540

tz_dsttime:0

##############################################################################

_______________________________________________________________________________

gmtime(取得目前時間和日期)

相關函數 time,asctime,ctime,localtime

表頭文件 #include<time.h>

定義函數 struct tm*gmtime(const time_t*timep);

函數說明 gmtime()將參數timep 所指的time_t 結構中的信息轉換成真實世界所使用的時間日期表示方法,然後將結果由結構tm返回。

結構tm的定義為

struct tm {

int tm_sec;

int tm_min;

int tm_hour;

int tm_mday;

int tm_mon;

int tm_year;

int tm_wday;

int tm_yday;

int tm_isdst;

};

int tm_sec 代表目前秒數,正常範圍為0-59,但允許至61秒

int tm_min 代表目前分數,範圍0-59

int tm_hour 從午夜算起的時數,範圍為0-23

int tm_mday 目前月份的日數,範圍01-31

int tm_mon 代表目前月份,從一月算起,範圍從0-11

int tm_year 從1900 年算起至今的年數

int tm_wday 一星期的日數,從星期一算起,範圍為0-6

int tm_yday 從今年1月1日算起至今的天數,範圍為0-365

int tm_isdst 日光節約時間的旗標

此函數返回的時間日期未經時區轉換,而是UTC時間。

返回值 返回結構tm代表目前UTC 時間

範例 #include <time.h>

int main(){

char *wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};

time_t timep;

struct tm *p;

time(&timep);

p=gmtime(&timep);

printf(“%d%d%d”,(1900+p->tm_year), (1+p->tm_mon),p->tm_mday);

printf(“%s%d;%d;%d\n”, wday[p->tm_wday], p->tm_hour, p->tm_min, p->tm_sec);

return 0;

}

執行

2000/10/28 Sat 8:15:38

##############################################################################

_______________________________________________________________________________

localtime(取得當地目前時間和日期)

相關函數 time, asctime, ctime, gmtime

表頭文件 #include<time.h>

定義函數 struct tm *localtime(const time_t * timep);

函數說明 localtime()將參數timep所指的time_t結構中的信息轉換成真實世界所使用的時間日期表示方法,然後將結果由結構tm返回。結構tm的定義請參考gmtime()。此函數返回的時間日期已經轉換成當地時區。

返回值 返回結構tm代表目前的當地時間。

範例

#include<time.h>

int main(){

char *wday[]={“Sun”,”Mon”,”Tue”,”Wed”,”Thu”,”Fri”,”Sat”};

time_t timep;

struct tm *p;

time(&timep);

p=localtime(&timep); /*取得當地時間*/

printf (“%d%d%d ”, (1900+p->tm_year),( l+p->tm_mon), p->tm_mday);

printf(“%s%d:%d:%d\n”, wday[p->tm_wday],p->tm_hour, p->tm_min, p->tm_sec);

return 0;

}

執行

2000/10/28 Sat 11:12:22

##############################################################################

_______________________________________________________________________________

mktime(將時間結構數據轉換成經過的秒數)

相關函數 time,asctime,gmtime,localtime

表頭文件 #include<time.h>

定義函數 time_t mktime(strcut tm * timeptr);

函數說明 mktime()用來將參數timeptr所指的tm結構數據轉換成從公元1970年1月1日0時0分0 秒算起至今的UTC時間所經過的秒數。

返回值 返回經過的秒數。

範例

/* 用time()取得時間(秒數),利用localtime()

轉換成struct tm 再利用mktine()將struct tm轉換成原來的秒數*/

#include<time.h>

int main(){

time_t timep;

strcut tm *p;

time(&timep);

printf(“time() : %d \n”,timep);

p=localtime(&timep);

timep = mktime(p);

printf(“time()->localtime()->mktime():%d\n”,timep);

return 0;

}

執行

time():974943297

time()->localtime()->mktime():974943297

##############################################################################

_______________________________________________________________________________

settimeofday(設置目前時間)

相關函數 time,ctime,ftime,gettimeofday

表頭文件 #include<sys/time.h>

& #include<unistd.h>

定義函數 int settimeofday ( const struct timeval *tv,const struct timezone *tz);

函數說明 settimeofday()會把目前時間設成由tv所指的結構信息,當地時區信息則設成tz所指的結構。詳細的說明請參考gettimeofday()。註意,只有root權限才能使用此函數修改時間。

返回值 成功則返回0,失敗返回-1,錯誤代碼存於errno。

錯誤代碼 EPERM 並非由root權限調用settimeofday(),權限不夠。

EINVAL 時區或某個數據是不正確的,無法正確設置時間。

##############################################################################

_______________________________________________________________________________

time(取得目前的時間)

相關函數 ctime,ftime,gettimeofday

表頭文件 #include<time.h>

定義函數 time_t time(time_t *t);

函數說明 此函數會返回從公元1970年1月1日的UTC時間從0時0分0秒算起到現在所經過的秒數。如果t 並非空指針的話,此函數也會將返回值存到t指針所指的內存。

返回值 成功則返回秒數,失敗則返回((time_t)-1)值,錯誤原因存於errno中。

範例

#include<time.h>

int mian(){

int seconds= time((time_t*)NULL);

printf(“%d\n”,seconds);

return 0;

}

執行

9.73E+08

##############################################################################

c/c++中時間函數和隨機函數的總結