?
??【數(shù)據(jù)結(jié)構(gòu)與算法】專題正在持續(xù)更新中,各種數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建原理與運(yùn)用?,經(jīng)典算法的解析?都在這兒,歡迎大家前往訂閱本專題,獲取更多詳細(xì)信息哦??????
??本系列專欄 - ?數(shù)據(jù)結(jié)構(gòu)與算法_勾欄聽曲_0
??歡迎大家 ??? ?點(diǎn)贊?? ?評論?? ?收藏??
??個人主頁 - 勾欄聽曲_0的博客??
??希望本文能對你有所幫助,如有不足請指正,共同進(jìn)步吧??
??善治病者,必醫(yī)其受病之處;善救弊者,必塞其起弊之源。??
計(jì)時(shí)器
通用計(jì)時(shí)器
????????使用c語言庫中的函數(shù)來完成計(jì)時(shí),不過精度只有毫秒
#include <time.h> //引入頭文件
int main()
{
clock_t start,end; //定義clock_t變量
start = clock(); //開始時(shí)間
fun() //需計(jì)時(shí)的函數(shù)
end = clock(); //結(jié)束時(shí)間
cout<<"time = "<<double(end-start)/CLOCKS_PER_SEC<<"s"<<endl; //輸出時(shí)間(單位:s)
}
高精度計(jì)時(shí)器
Windows環(huán)境
????????這個高精度計(jì)數(shù)的方法想要用到<windows.h>的頭文件,是以微秒為單位,但是QueryPerformanceCounter()確切的精確計(jì)時(shí)的最小單位是與系統(tǒng)有關(guān)的,這個方法只在Windows環(huán)境下可用。
#include <windows.h> //引入頭文件
int main()
{
LARGE_INTEGER t1,t2,tc;
QueryPerformanceFrequency(&tc);
QueryPerformanceCounter(&t1);
fun() //需計(jì)時(shí)的函數(shù)
QueryPerformanceCounter(&t2);
time=(double)(t2.QuadPart-t1.QuadPart)/(double)tc.QuadPart;
cout<<"time = "<<time<<endl; //輸出時(shí)間(單位:s)
}
Linux環(huán)境
????????這段代碼的目的是在Linux環(huán)境下計(jì)算程序運(yùn)行時(shí)間的高精度計(jì)時(shí)函數(shù)。clock_gettime函數(shù)是Linux環(huán)境下的一個函數(shù),它不是標(biāo)準(zhǔn)的C語言函數(shù),所以在Windows環(huán)境下可能不被支持。它的主要思路是:
????????????????定義一個函數(shù)get_nanoseconds,用于返回當(dāng)前時(shí)間的納秒數(shù)。納秒是10的-9次方秒,是一種非常精確的時(shí)間單位。
????????????????在函數(shù)中,使用clock_gettime函數(shù),獲取當(dāng)前時(shí)間,存儲在一個timespec結(jié)構(gòu)體中。這個結(jié)構(gòu)體有兩個成員變量,一個是秒數(shù),一個是納秒數(shù)。
????????????????返回這個結(jié)構(gòu)體中的秒數(shù)乘以10的9次方,加上納秒數(shù),得到當(dāng)前時(shí)間的納秒數(shù)。
????????????????在主函數(shù)中,定義一個變量start,調(diào)用get_nanoseconds函數(shù),獲取程序開始運(yùn)行時(shí)的時(shí)間。
? ? ? ? ? ? ? ? 執(zhí)行你要計(jì)時(shí)的程序代碼。
????????????????定義一個變量end,調(diào)用get_nanoseconds函數(shù),獲取程序結(jié)束運(yùn)行時(shí)的時(shí)間。
????????????????計(jì)算end和start的差值,除以10的9次方,得到程序運(yùn)行時(shí)間的秒數(shù)。
#include <stdio.h>
#include <time.h>
// 定義一個函數(shù),返回當(dāng)前時(shí)間的納秒數(shù)
long long get_nanoseconds() {
// 定義一個timespec結(jié)構(gòu)體,用于存儲時(shí)間信息
struct timespec ts;
// 調(diào)用clock_gettime函數(shù),獲取當(dāng)前時(shí)間,存儲在ts中
clock_gettime(CLOCK_MONOTONIC, &ts);
// 返回ts中的秒數(shù)乘以10的9次方,加上納秒數(shù)
return ts.tv_sec * 1000000000LL + ts.tv_nsec;
}
// 測試函數(shù)
int main() {
// 定義一個變量,存儲開始時(shí)間
long long start = get_nanoseconds();
// 執(zhí)行一些操作,比如打印一句話
printf("Hello, world!\n");
// 定義一個變量,存儲結(jié)束時(shí)間
long long end = get_nanoseconds();
// 計(jì)算運(yùn)行時(shí)間,單位為秒
double duration = (end - start) / 1000000000.0;
// 打印結(jié)果
printf("The program took %f seconds to run.\n", duration);
return 0;
}
隨機(jī)數(shù)生成
普通隨機(jī)數(shù)生成
????????? 生成隨機(jī)數(shù)最常見的方法是用內(nèi)置的函數(shù)rand()函數(shù),再由srand()函數(shù)(用于給rand()函數(shù)設(shè)定種子)配合time() 函數(shù)獲取不同的種子,由此來生成隨機(jī)數(shù)。
#include <time.h>
// 定義一個函數(shù),返回一個在min和max之間的隨機(jī)整數(shù)
int random_int(int min, int max) {
// 使用當(dāng)前時(shí)間作為隨機(jī)數(shù)種子
srand(time(NULL));
// 生成一個在0到max-min之間的隨機(jī)數(shù),然后加上min
return rand() % (max - min + 1) + min;
}
高精度隨機(jī)數(shù)生成
Windows環(huán)境
上述方法雖然可以生成隨機(jī)數(shù),但是有一個缺點(diǎn),那就是time()獲取的時(shí)間是秒,而程序運(yùn)行速度較快時(shí),在同一秒中生生成了多個隨機(jī)數(shù),那么他們的種子就都是相同的,生成的隨機(jī)數(shù)也是一樣的。所以這個方法并不是特別實(shí)用。
? ? ? ? 在這里我們來介紹一種利用硬件可以在一秒內(nèi)生成多個隨機(jī)數(shù)的方法,其原理與上面類似,不過這個取的種子的精度并不是秒,而是微秒,這樣就能最大程度的保障每一次生成隨機(jī)數(shù)的種子都是不同的。文章來源:http://www.zghlxwxcb.cn/news/detail-425762.html
/*
Random:一秒內(nèi)生成不同隨機(jī)數(shù)
參數(shù):
@n : 為精度,即運(yùn)算中保留小數(shù)點(diǎn)后幾位
@min:隨機(jī)數(shù)的最小取值
@max: 隨機(jī)數(shù)的最大取值
*/
int Random(int n,int min,int max)
{
LARGE_INTEGER seed;
QueryPerformanceFrequency(&seed);//返回硬件支持的高精度計(jì)數(shù)器的頻率
QueryPerformanceCounter(&seed);//函數(shù)返回高精確度性能計(jì)數(shù)器的值,它可以以微妙為單位計(jì)
srand(seed.QuadPart); //初始化一個以微秒為單位的時(shí)間種子
int Precision = pow(10,n) - 1;
return (int)((rand() % Precision / (float)(Precision + 1))*pow(10,n)) % max + min;
}
Linux環(huán)境
? ? ? ? 一樣是利用上面再Linux環(huán)境下高精度的計(jì)時(shí)器來完成在一秒以內(nèi)生成多個不同的隨機(jī)數(shù)的功能。文章來源地址http://www.zghlxwxcb.cn/news/detail-425762.html
#include <time.h>
// 定義一個函數(shù),返回一個在min和max之間的隨機(jī)整數(shù)
int random_int(int min, int max) {
// 定義一個timespec結(jié)構(gòu)體,用于存儲時(shí)間信息
struct timespec ts;
// 調(diào)用clock_gettime函數(shù),獲取當(dāng)前時(shí)間,存儲在ts中
clock_gettime(CLOCK_MONOTONIC, &ts);
// 返回ts中的秒數(shù)乘以10的9次方,加上納秒數(shù)
// 使用當(dāng)前時(shí)間的納秒數(shù)作為隨機(jī)數(shù)種子
srand(ts.tv_sec * 1000000000LL + ts.tv_nsec);
// 生成一個在0到max-min之間的隨機(jī)數(shù),然后加上min
return rand() % (max - min + 1) + min;
}
到了這里,關(guān)于C語言/C++隨機(jī)數(shù)生成,程序運(yùn)行時(shí)間計(jì)時(shí)器(含高精度計(jì)時(shí)器),包括Windows環(huán)境與Linux環(huán)境的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!