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

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

正文


计时器


通用计时器


       使用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;  
}
相关文章
|
9天前
|
Linux 虚拟化 Docker
Linux服务器部署docker windows
在当今软件开发中,Docker成为流行的虚拟化技术,支持在Linux服务器上运行Windows容器。流程包括:1) 安装Docker;2) 配置支持Windows容器;3) 获取Windows镜像;4) 运行Windows容器;5) 验证容器状态。通过这些步骤,你可以在Linux环境中顺利部署和管理Windows应用,提高开发和运维效率。
59 1
|
10天前
|
NoSQL IDE MongoDB
Studio 3T 2025.4 (macOS, Linux, Windows) - MongoDB 的终极 GUI、IDE 和 客户端
Studio 3T 2025.4 (macOS, Linux, Windows) - MongoDB 的终极 GUI、IDE 和 客户端
26 0
Studio 3T 2025.4 (macOS, Linux, Windows) - MongoDB 的终极 GUI、IDE 和 客户端
|
10天前
|
安全 Linux iOS开发
Gitea Enterprise 23.4.0 (Linux, macOS, Windows) - 本地部署的企业级 Gti 服务
Gitea Enterprise 23.4.0 (Linux, macOS, Windows) - 本地部署的企业级 Gti 服务
32 0
Gitea Enterprise 23.4.0 (Linux, macOS, Windows) - 本地部署的企业级 Gti 服务
|
14天前
|
数据管理 Linux iOS开发
Splunk Enterprise 9.4.1 (macOS, Linux, Windows) 发布 - 机器数据管理和分析
Splunk Enterprise 9.4.1 (macOS, Linux, Windows) 发布 - 机器数据管理和分析
22 0
Splunk Enterprise 9.4.1 (macOS, Linux, Windows) 发布 - 机器数据管理和分析
|
17天前
|
Linux 网络安全 iOS开发
Metasploit Framework 6.4.49 (macOS, Linux, Windows) - 开源渗透测试框架
Metasploit Framework 6.4.49 (macOS, Linux, Windows) - 开源渗透测试框架
27 0
Metasploit Framework 6.4.49 (macOS, Linux, Windows) - 开源渗透测试框架
|
前端开发 rax Linux
Linux 程序 Linux编译 Linux编译过程的来龙去脉
Linux 程序编译过程的来龙去脉 大家肯定都知道计算机程序设计语言通常分为机器语言、汇编语言和高级语言三类。高级语言需要通过翻译成机器语言才能执行,而翻译的方式分为两种,一种是编译型,另一种是解释型,因此我们基本上将高级语言分为两大类,一种是编译型语言,例如C,C++,Java,另一种是解释型语言,例如Python、Ruby、MATLAB 、JavaScript。
1245 0
|
2天前
|
Linux
Linux 常用文件查看命令
`cat` 命令用于连接文件并打印到标准输出,适用于快速查看和合并文本文件内容。常用示例包括:`cat file1.txt` 查看单个文件,`cat file1.txt file2.txt` 合并多个文件,`cat &gt; filename` 创建新文件,`cat &gt;&gt; filename` 追加内容。`more` 和 `less` 命令用于分页查看文件,`tail` 命令则用于查看文件末尾内容,支持实时追踪日志更新,如 `tail -f file.log`。
21 5
Linux 常用文件查看命令
|
1月前
|
Linux
Linux系统之whereis命令的基本使用
Linux系统之whereis命令的基本使用
77 24
Linux系统之whereis命令的基本使用
|
9天前
|
Linux
Linux od命令
本文详细介绍了Linux中的 `od`命令,包括其基本语法、常用选项和示例。通过这些内容,你可以灵活地使用 `od`命令查看文件内容,提高分析和调试效率。确保理解每一个选项和示例的实现细节,应用到实际工作中时能有效地处理各种文件查看需求。
43 19
|
20天前
|
缓存 Ubuntu Linux
Linux中yum、rpm、apt-get、wget的区别,yum、rpm、apt-get常用命令,CentOS、Ubuntu中安装wget
通过本文,我们详细了解了 `yum`、`rpm`、`apt-get`和 `wget`的区别、常用命令以及在CentOS和Ubuntu中安装 `wget`的方法。`yum`和 `apt-get`是高层次的包管理器,分别用于RPM系和Debian系发行版,能够自动解决依赖问题;而 `rpm`是低层次的包管理工具,适合处理单个包;`wget`则是一个功能强大的下载工具,适用于各种下载任务。在实际使用中,根据系统类型和任务需求选择合适的工具,可以大大提高工作效率和系统管理的便利性。
111 25