🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨,经典算法的解析✨都在这儿,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏
🪔本系列专栏 - 数据结构与算法_勾栏听曲_0
🍻欢迎大家 🏹 点赞👍 评论📨 收藏⭐️
📌个人主页 - 勾栏听曲_0的博客📝
🔑希望本文能对你有所帮助,如有不足请指正,共同进步吧🏆
🎇善治病者,必医其受病之处;善救弊者,必塞其起弊之源。📈
计时器
通用计时器
使用c语言库中的函数来完成计时,不过精度只有毫秒
#include <time.h> //引入头文件
int main()
{
clock_t start,end; //定义clock_t变量
start = clock(); //开始时间
fun() //需计时的函数
end = clock(); //结束时间
cout<<"time = "<<double(end-start)/CLOCKS_PER_SEC<<"s"<<endl; //输出时间(单位:s)
}
高精度计时器
Windows环境
这个高精度计数的方法想要用到<windows.h>的头文件,是以微秒为单位,但是QueryPerformanceCounter()确切的精确计时的最小单位是与系统有关的,这个方法只在Windows环境下可用。
#include <windows.h> //引入头文件
int main()
{
LARGE_INTEGER t1,t2,tc;
QueryPerformanceFrequency(&tc);
QueryPerformanceCounter(&t1);
fun() //需计时的函数
QueryPerformanceCounter(&t2);
time=(double)(t2.QuadPart-t1.QuadPart)/(double)tc.QuadPart;
cout<<"time = "<<time<<endl; //输出时间(单位:s)
}
Linux环境
这段代码的目的是在Linux环境下计算程序运行时间的高精度计时函数。clock_gettime函数是Linux环境下的一个函数,它不是标准的C语言函数,所以在Windows环境下可能不被支持。它的主要思路是:
定义一个函数get_nanoseconds,用于返回当前时间的纳秒数。纳秒是10的-9次方秒,是一种非常精确的时间单位。
在函数中,使用clock_gettime函数,获取当前时间,存储在一个timespec结构体中。这个结构体有两个成员变量,一个是秒数,一个是纳秒数。
返回这个结构体中的秒数乘以10的9次方,加上纳秒数,得到当前时间的纳秒数。
在主函数中,定义一个变量start,调用get_nanoseconds函数,获取程序开始运行时的时间。
执行你要计时的程序代码。
定义一个变量end,调用get_nanoseconds函数,获取程序结束运行时的时间。
计算end和start的差值,除以10的9次方,得到程序运行时间的秒数。
#include <stdio.h>
#include <time.h>
// 定义一个函数,返回当前时间的纳秒数
long long get_nanoseconds() {
// 定义一个timespec结构体,用于存储时间信息
struct timespec ts;
// 调用clock_gettime函数,获取当前时间,存储在ts中
clock_gettime(CLOCK_MONOTONIC, &ts);
// 返回ts中的秒数乘以10的9次方,加上纳秒数
return ts.tv_sec * 1000000000LL + ts.tv_nsec;
}
// 测试函数
int main() {
// 定义一个变量,存储开始时间
long long start = get_nanoseconds();
// 执行一些操作,比如打印一句话
printf("Hello, world!\n");
// 定义一个变量,存储结束时间
long long end = get_nanoseconds();
// 计算运行时间,单位为秒
double duration = (end - start) / 1000000000.0;
// 打印结果
printf("The program took %f seconds to run.\n", duration);
return 0;
}
随机数生成
普通随机数生成
生成随机数最常见的方法是用内置的函数rand()函数,再由srand()函数(用于给rand()函数设定种子)配合time() 函数获取不同的种子,由此来生成随机数。
#include <time.h>
// 定义一个函数,返回一个在min和max之间的随机整数
int random_int(int min, int max) {
// 使用当前时间作为随机数种子
srand(time(NULL));
// 生成一个在0到max-min之间的随机数,然后加上min
return rand() % (max - min + 1) + min;
}
高精度随机数生成
Windows环境
上述方法虽然可以生成随机数,但是有一个缺点,那就是time()获取的时间是秒,而程序运行速度较快时,在同一秒中生生成了多个随机数,那么他们的种子就都是相同的,生成的随机数也是一样的。所以这个方法并不是特别实用。
在这里我们来介绍一种利用硬件可以在一秒内生成多个随机数的方法,其原理与上面类似,不过这个取的种子的精度并不是秒,而是微秒,这样就能最大程度的保障每一次生成随机数的种子都是不同的。
/*
Random:一秒内生成不同随机数
参数:
@n : 为精度,即运算中保留小数点后几位
@min:随机数的最小取值
@max: 随机数的最大取值
*/
int Random(int n,int min,int max)
{
LARGE_INTEGER seed;
QueryPerformanceFrequency(&seed);//返回硬件支持的高精度计数器的频率
QueryPerformanceCounter(&seed);//函数返回高精确度性能计数器的值,它可以以微妙为单位计
srand(seed.QuadPart); //初始化一个以微秒为单位的时间种子
int Precision = pow(10,n) - 1;
return (int)((rand() % Precision / (float)(Precision + 1))*pow(10,n)) % max + min;
}
Linux环境
一样是利用上面再Linux环境下高精度的计时器来完成在一秒以内生成多个不同的随机数的功能。
#include <time.h>
// 定义一个函数,返回一个在min和max之间的随机整数
int random_int(int min, int max) {
// 定义一个timespec结构体,用于存储时间信息
struct timespec ts;
// 调用clock_gettime函数,获取当前时间,存储在ts中
clock_gettime(CLOCK_MONOTONIC, &ts);
// 返回ts中的秒数乘以10的9次方,加上纳秒数
// 使用当前时间的纳秒数作为随机数种子
srand(ts.tv_sec * 1000000000LL + ts.tv_nsec);
// 生成一个在0到max-min之间的随机数,然后加上min
return rand() % (max - min + 1) + min;
}