C语言/C++随机数生成,程序运行时间计时器(含高精度计时器),包括Windows环境与Linux环境

本文介绍了数据结构与算法的相关专题,包括不同数据结构的原理和应用,以及经典算法的解析。同时,文章详细讨论了如何在C语言中实现计时器,对比了毫秒级和微秒级的计时方法,分别适用于Windows和Linux环境。此外,还讲解了随机数生成,分析了普通rand()函数的局限,并提出了基于高精度计时的Windows和Linux环境下的随机数生成方案,以确保在同一秒内生成不同的随机数。
摘要由CSDN通过智能技术生成

 

🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨,经典算法的解析✨都在这儿,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏

🪔本系列专栏 -  数据结构与算法_勾栏听曲_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;  
}
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勾栏听曲_0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值