c/c++中時間函數和隨機函數的總結
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++中時間函數和隨機函數的總結