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;  
}
相关文章
|
18天前
|
安全 Ubuntu Linux
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
38 9
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
|
1天前
|
Ubuntu 网络协议 Linux
快速部署WSL(Windows Subsystem for Linux)
WSL提供了一种轻量级的方法,使开发者能够在Windows上无缝运行Linux环境。通过本文介绍的步骤,可以快速安装、配置和使用WSL,以满足开发和测试的需求。
21 8
|
18天前
|
自然语言处理 安全 Java
Nexpose 7.0.1 for Linux & Windows - 漏洞扫描
Nexpose 7.0.1 for Linux & Windows - 漏洞扫描
38 6
|
21天前
|
关系型数据库 MySQL Linux
MySQL数据库下载安装教程(Windows&Linux)
本文档详细介绍了MySQL的安装步骤,包括安装前的准备工作、下载安装包、Windows和Linux系统下的具体安装流程,以及如何配置MySQL服务、设置环境变量、启动服务和连接数据库等关键操作。
|
1月前
|
NoSQL Linux PHP
如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤
本文介绍了如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤。接着,对比了两种常用的 PHP Redis 客户端扩展:PhpRedis 和 Predis,详细说明了它们的安装方法及优缺点。最后,提供了使用 PhpRedis 和 Predis 在 PHP 中连接 Redis 服务器及进行字符串、列表、集合和哈希等数据类型的基本操作示例。
64 4
|
24天前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
48 10
|
24天前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
43 9
|
24天前
|
存储 Unix Serverless
【C语言】常用函数汇总表
本文总结了C语言中常用的函数,涵盖输入/输出、字符串操作、内存管理、数学运算、时间处理、文件操作及布尔类型等多个方面。每类函数均以表格形式列出其功能和使用示例,便于快速查阅和学习。通过综合示例代码,展示了这些函数的实际应用,帮助读者更好地理解和掌握C语言的基本功能和标准库函数的使用方法。感谢阅读,希望对你有所帮助!
33 8
|
24天前
|
C语言 开发者
【C语言】数学函数详解
在C语言中,数学函数是由标准库 `math.h` 提供的。使用这些函数时,需要包含 `#include <math.h>` 头文件。以下是一些常用的数学函数的详细讲解,包括函数原型、参数说明、返回值说明以及示例代码和表格汇总。
43 6