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

news2024/9/22 9:54:31

 

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

🪔本系列专栏 -  数据结构与算法_勾栏听曲_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;  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/440523.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工厂模式概述

通常有三种形态: 简单工厂模式&#xff0c;不属于23种设计模式之一 工厂方法模式&#xff0c;是23种设计模式之一 抽象工厂模式&#xff0c;是23种设计模式之一 1.简单工厂模式是工厂模式的一种特殊实现&#xff0c;又被称为静态工厂方法模式 2.简单工厂模式解决的问题:客户端不…

【Verilog HDL】FPGA-Verilog文件的基本结构

&#x1f389;欢迎来到FPGA专栏~Verilog文件的基本结构 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大…

SSM框架MyBatis 三种分页查询 PageHlper的使用以及五个参数的简单解释

SSM框架MyBatis 三种简单的分页查询 1. 基础分页查询&#xff08;环境在第一天的配置中有&#xff09; mapper也就是dao //查询总数Select("select count(*) from book;")int selectCount();//分页查询Select("select * from book limit #{currpage},#{size}&q…

windows快捷键汇总

Windows 系统中有很多常用的快捷键&#xff0c;这些快捷键可以帮助我们快速完成一些操作&#xff0c;提高我们的工作效率。下面是一些使用 Windows 快捷键的好处和长期利弊&#xff1a; 好处&#xff1a; 可以快速完成一些操作&#xff0c;提高工作效率。可以让我们的工作更加…

2023年RHCE第二次作业

1.配置ntp时间服务器&#xff0c;确保客户端主机能和服务主机同步时间 2.配置ssh免密登陆&#xff0c;能够通过客户端主机通过redhat用户和服务端主机基于公钥验证方式进行远程连接 1配置Chrony服务器 先下载chrony--------dnf install -y chrony 查看和配置chrony.conf文件 …

Centos7 安装mysql 8.0.32版本(解压glibc版本)

Centos 7 安装 MySQL 8.0.32 glibc 版本总结 Centos7中安装MySQL服务时&#xff0c;首先需要卸载掉mariadb&#xff0c;mariadb可能会与MySQL产生冲突。 1、卸载mariadb 查找mariadb是否已经安装&#xff08;默认已经安装&#xff09; rpm -qa | grep mariadb接下来将查找到…

QWidget改变背景图的方法和坑

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、添加背景图资源文件二、使用 QPalette三、重写paintEvent() 函数四、使用QT的设计师界面总结 前言 本篇文章将讲解QWidget改变背景图的方法和会遇到的问题…

Flutter插件开发-(基础篇)

在开发flutter项目的时分通常会运用一些三方的的packages或许plugin&#xff0c;二者的区别&#xff1a;packages主要是包括的Dart代码块&#xff0c;而plugin则包括iOS和android的代码。 因此来说创立plugin和packages的流程是相似的&#xff0c;下面就以创立plugin为例进行展…

Spring原理学习(六):Spring实现动态代理时对jdk和cglib的选择

目录 〇、前言 一、AOP中的一些基本概念 二、两个切面的概念 三、advisor的使用 3.1 前置知识 3.2 使用步骤 四、spring对jdk和cglib的统一 〇、前言 对jdk和cglib 实现动态代理的原理不清楚的兄弟们&#xff0c;可以参考前文&#xff1a;Spring原理学习&#xff08;…

Python+Qt人脸识别职工录入管理系统

程序示例精选 PythonQt人脸识别职工录入管理系统 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<PythonQt人脸识别职工录入管理系统>>编写代码&#xff0c;代码整洁&#xff0c…

【FTP】——文件传输协议

文章目录 1.FTP简介1.1 FTP概述1.2 FTP主动模式1.3 FTP被动模式 2. 实例&#xff1a;匿名用户访问FTP服务3. 实例&#xff1a;本地用户访问FTP服务 1.FTP简介 1.1 FTP概述 FTP服务——用来传输文件的协议。 FTP服务器默认使用TCP协议的20、21端口与客户端进行通信. 20端口…

【学习笔记】Linux基础

Linux基础 一、操作系统1、什么是操作系统2、Linux操作系统3、Linux系统目录&#xff0c;Linux倒挂树型目录结构&#xff1a;4、安装Xshell与Xftp5、Linux文件操作命令6、vim文本编辑器&#xff08;1&#xff09;vim三种模式&#xff08;2&#xff09;vim重要快捷键&#xff08…

Dell Inspiron 5570电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板Dell Inspiron 5570 处理器Intel(R) Core(TM) i7-8550U CPU 1.80GHz已驱动 内存8 GB 2400 MHz DDR4已驱动 硬盘samsung ssd 850 evo 250 go已驱…

汽车跨界还能这么玩?解锁汽车跨界新模式

跨界&#xff0c;是一种商业思维&#xff0c;是出圈方式&#xff0c;是进入流量红海的手段之一。近几年来&#xff0c;国内掀起了一股跨界风&#xff0c;“跨界增值宣传”似乎成为了品牌年轻化的必经之路&#xff0c;众多品牌通过跨界的方式实现互相补足、用户渗透&#xff0c;…

#Chrome扩展程序开发教程--01:基本概念介绍

#Chrome扩展程序开发教程--01&#xff1a;基本概念介绍 引言1、什么是扩展程序&#xff1f;2、Web技术3、Chrome 扩展程序API4、扩展程序架构 引言 本系列博客旨在带来最新的Chrome扩展程序开发入门教程。 1、什么是扩展程序&#xff1f; 通过向Chrome浏览器添加自定义特性和功…

Docker容器---网络、容器操作

Docker容器---网络、容器操作 一、docker实现原理二、docker网路模式1、Host模式2、container模式3、none模式4、bridge模式 三、自定义网络1、查看网络模式列表2、查看容器信息3、指定分配IP地址4、自定义网络固定IP 四、暴露端口五、容器端口映射1、创建端口映射 六、资源控制…

wordpress建站/demo

bidewang.co/ele 建站的另一种途径Sign in – My Account tanrenchang.atspace.cc 登录 ‹ Fashion trading platform — WordPress cPanel 是一个用于管理网站的虚拟主机控制面板。 使用 cPanel&#xff0c;可以轻松管理电子邮件帐户、数据库、FTP 用户以及与托管、设置和管…

windows10下使用minGW64 编译krita源码报错

系列文章目录 文章目录 系列文章目录前言一、错误原因二、使用步骤1.引入库 前言 collect2.exe: error: ld returned 1 exit status mingw32-make[2]: *** [plugins\color\lcms2engine\CMakeFiles\kritalcmsengine.dir\build.make:614: bin/kritalcmsengine.dll] Error 1 ming…

websever|2.19-2.27|信号概述-SIGCHILD信号

2.19信号概述 信号也是进程间通信的一种方式 其中1-31是操作系统定义的标准信号&#xff0c;比较重要。需要掌握其中几个。 34-64是预定义好的信号&#xff0c;是实时的信号 core文件中保存异常终止的一些信息。 在2.20节的开头&#xff0c;老师重点讲解了 的core文件。 进程出…

57 openEuler搭建Mariadb数据库服务器-管理数据库用户

文章目录 57 openEuler搭建Mariadb数据库服务器-管理数据库用户57.1 创建用户57.2 查看用户57.3 修改用户57.3.1 修改用户名57.3.2 修改用户示例57.3.3 修改用户密码57.3.4 修改用户密码示例 57.4 删除用户57.5 用户授权57.6 删除用户权限 57 openEuler搭建Mariadb数据库服务器…