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;  
}
相关文章
|
4月前
|
安全 编译器 C语言
C++入门1——从C语言到C++的过渡
C++入门1——从C语言到C++的过渡
93 2
|
2月前
|
安全 网络协议 Linux
telnet在windows和linux上的使用方法
Telnet是一个简单且强大的网络工具,广泛用于远程管理和网络诊断。尽管存在安全风险,但在受控环境中,Telnet仍然是一个非常有用的工具。通过本文的介绍,您应该能够在Windows和Linux系统上安装并使用Telnet进行各种网络操作。
191 18
|
2月前
|
Ubuntu 网络协议 Linux
快速部署WSL(Windows Subsystem for Linux)
WSL提供了一种轻量级的方法,使开发者能够在Windows上无缝运行Linux环境。通过本文介绍的步骤,可以快速安装、配置和使用WSL,以满足开发和测试的需求。
195 8
|
2月前
|
关系型数据库 MySQL Linux
MySQL数据库下载安装教程(Windows&Linux)
本文档详细介绍了MySQL的安装步骤,包括安装前的准备工作、下载安装包、Windows和Linux系统下的具体安装流程,以及如何配置MySQL服务、设置环境变量、启动服务和连接数据库等关键操作。
|
2月前
|
算法 编译器 C语言
【C语言】C++ 和 C 的优缺点是什么?
C 和 C++ 是两种强大的编程语言,各有其优缺点。C 语言以其高效性、底层控制和简洁性广泛应用于系统编程和嵌入式系统。C++ 在 C 语言的基础上引入了面向对象编程、模板编程和丰富的标准库,使其适合开发大型、复杂的软件系统。 在选择使用 C 还是 C++ 时,开发者需要根据项目的需求、语言的特性以及团队的技术栈来做出决策。无论是 C 语言还是 C++,了解其优缺点和适用场景能够帮助开发者在实际开发中做出更明智的选择,从而更好地应对挑战,实现项目目标。
120 0
|
4月前
|
存储 程序员 编译器
简述 C、C++程序编译的内存分配情况
在C和C++程序编译过程中,内存被划分为几个区域进行分配:代码区存储常量和执行指令;全局/静态变量区存放全局变量及静态变量;栈区管理函数参数、局部变量等;堆区则用于动态分配内存,由程序员控制释放,共同支撑着程序运行时的数据存储与处理需求。
271 22
|
4月前
|
C语言 C++
C 语言的关键字 static 和 C++ 的关键字 static 有什么区别
在C语言中,`static`关键字主要用于变量声明,使得该变量的作用域被限制在其被声明的函数内部,且在整个程序运行期间保留其值。而在C++中,除了继承了C的特性外,`static`还可以用于类成员,使该成员被所有类实例共享,同时在类外进行初始化。这使得C++中的`static`具有更广泛的应用场景,不仅限于控制变量的作用域和生存期。
107 10
|
5月前
|
C++
【C++基础】程序流程结构详解
这篇文章详细介绍了C++中程序流程的三种基本结构:顺序结构、选择结构和循环结构,包括if语句、三目运算符、switch语句、while循环、do…while循环、for循环以及跳转语句break、continue和goto的使用和示例。
92 2
|
4月前
|
关系型数据库 MySQL Linux
Navicat 连接 Windows、Linux系统下的MySQL 各种错误,修改密码。
使用Navicat连接Windows和Linux系统下的MySQL时可能遇到的四种错误及其解决方法,包括错误代码2003、1045和2013,以及如何修改MySQL密码。
502 0
|
4月前
|
C语言 C++
实现两个变量值的互换[C语言和C++的区别]
实现两个变量值的互换[C语言和C++的区别]
50 0