【C++】详解用标准库的std::mt19937生成随机数
2023年8月16日,周三晚上
写了1个半小时
目录
- 概述
- 英文文档
- 什么是mt19937
- 什么是状态大小
- 头文件
- std::mt19937的常用成员函数
- 1. 构造函数:
- 2. 种子操作函数:
- 3. 随机数生成函数:
- 4. 辅助函数:
- 生成种子值
- 方法1:使用std::random_device
- 方法2:使用时间戳
- 举例说明
概述
英文文档
std::mersenne_twister_engine - cppreference.com
https://cplusplus.com/reference/random/mt19937/
什么是mt19937
std::mt19937是C++标准库中的一个伪随机数生成器类,它实现了梅森旋转算法(Mersenne Twister)。mt19937类是一个随机数引擎,可以生成高质量的伪随机数序列。
A Mersenne Twister pseudo-random generator of 32-bit numbers with a state size of 19937 bits.
一个有着19937位状态大小的能够生成32位数的梅森旋转伪随机生成器
什么是状态大小
状态大小(state size)指的是在随机数生成器中用于存储和更新内部状态的位数或字节数。随机数生成器的状态是一个关键的组成部分,它影响着生成的随机数序列的质量和性能。
状态大小越大,生成的随机数序列的周期(即重复之前经过的步骤数)通常越长,这意味着生成的随机数更不容易重复。较大的状态大小还可以提供更好的统计特性和更高的随机性。
状态大小的选择通常需要权衡随机性和性能之间的关系。较大的状态大小可能需要更多的内存和计算资源来存储和更新状态,可能会影响性能。因此,在选择状态大小时需要综合考虑应用的需求、可用资源和随机性要求。
对于std::mt19937而言,它使用19937位的状态大小,这是一个较大的状态大小,可以提供较长的周期和较好的随机性特性。
头文件
使用mt19937需要包含<random>头文件。
std::mt19937的常用成员函数
1. 构造函数:
- mt19937():默认构造函数,使用默认的种子初始化随机数引擎。
- mt19937(unsigned int seed):使用指定的种子初始化随机数引擎。
2. 种子操作函数:
- seed():设置种子值为默认值。
- seed(unsigned int seed):设置新的种子值。
3. 随机数生成函数:
- operator():生成一个32位的随机整数。
4. 辅助函数:
- discard(unsigned long long z):等同于执行z次operator(),以丢弃z次生成的随机数。
- min():获取可生成的最小随机数值。
- max():获取可生成的最大随机数值。
生成种子值
方法1:使用std::random_device
std::random_device是C++标准库中的一个类,它通常被用作生成伪随机数生成器的种子,以提供更高质量的随机性。
#include <chrono>
#include <random>
#include<iostream>int main() {std::random_device rd; // 创建一个std::random_device对象unsigned int seed = rd(); // 生成一个随机的种子值std::mt19937 engine(seed); // 使用随机的种子值创建一个伪随机数生成器std::cout<<engine();return 0;
}
方法2:使用时间戳
可以使用C++标准库中的std::chrono库来获取当前的时间戳,并将其转换为整数形式作为种子值。
#include <chrono>
#include <random>
#include <iostream>unsigned int generateSeedFromTimestamp() {auto now = std::chrono::system_clock::now(); // 获取当前时间点auto timestamp = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()); // 转换为毫秒级的时间戳return static_cast<unsigned int>(timestamp.count()); // 将时间戳转换为整数种子值
}int main() {unsigned int seed = generateSeedFromTimestamp(); // 生成种子值std::mt19937 engine(seed); // 使用种子值初始化伪随机数生成器std::cout<<engine();return 0;
}
举例说明
#include <chrono>
#include <random>
#include<iostream>int main() {std::random_device rd; // 创建一个std::random_device对象unsigned int seed = rd(); // 生成一个随机的种子值std::mt19937 engine(seed); //使用随机的种子值创建一个伪随机数生成器engine.seed(rd());//给engine设置一个新的种子值std::cout << "最小值:" << engine.min() << std::endl; // 输出最小值std::cout << "最大值:" << engine.max() << std::endl; // 输出最大值std::cout << "生成一个随机数:" << engine() << std::endl; // 输出最大值engine.discard(5);return 0;
}
相关文章:
【C++】详解用标准库的std::mt19937生成随机数
2023年8月16日,周三晚上 写了1个半小时 目录 概述英文文档什么是mt19937什么是状态大小头文件std::mt19937的常用成员函数1. 构造函数:2. 种子操作函数:3. 随机数生成函数:4. 辅助函数:生成种子值方法1:使…...

科大讯飞发布星火认知大模型2.0版——体验实测
8月15日,科大讯飞举行讯飞星火认知大模型V2.0升级发布会,对外展示其升级后的大模型代码能力和多模态能力,同时发布并升级搭载讯飞星火认知大模型V2.0能力的多项应用和产品。自5月6日首发以来,星火认知大模型经历V1.5版本的迭代&am…...

部署mysql到win10电脑上
中间出现了很多问题, 记录一下 我这边是去官网下载的 ,链接:https://dev.mysql.com/downloads/mysql/ 我这边选了不是最新版本的MySQL,因为第一次安装8.1.0版本的,死活运行不起来,直接卸载安重装了&#x…...
nginx+php 出现502 bad gateway
nginxphp 出现502 bad gateway,一般这都不是nginx的问题,而是由于 fastcgi或者php的问题导致的,常见的有以下几种。 1. php.ini 的memory_limit 过小(如果有个别php程序进程需要占用极大内存时这个必须注意) 2. ph…...

基于LVQ神经网络的人脸朝向识别
1案例背景 1.1人脸识别概述 人脸识别作为一个复杂的模式识别问题,近年来受到了广泛的关注,识别领域的各种方法在这个问题上各显所长,而且发展出了许多新方法,大大丰富和拓宽了模式识别的方向。人脸识别、检测,跟踪、特征定位等技术近年来一直是研究的热点。人脸识别是人脸应用…...

Leetcode Top 100 Liked Questions(序号53~74)
53. Maximum Subarray 题意:一个数组,找到和最大的子串 我的思路 我记得好像On的动态规划来做的?但是想不起来了,先死做,用的前缀和——TLE超时 那就只能想想dp怎么做了 假设dp[i]表示的是以 i 为右端点的最大的…...

Rabbitmq消息不丢失
目录 一、消息不丢失1.消息确认2.消息确认业务封装2.1 发送确认消息测试2.2 消息发送失败,设置重发机制 一、消息不丢失 消息的不丢失,在MQ角度考虑,一般有三种途径: 1,生产者不丢数据 2,MQ服务器不丢数据…...
Kotlin runBlocking launch多个协程读写mutableListOf时序
Kotlin runBlocking launch多个协程读写mutableListOf时序 import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.runBlockingfun main(args: Array<String>) {var lists mutableListOf<String>()runBlocking {launch {r…...

Spring Cloud微服务治理框架深度解析
在学习一个技术之前,首先我们要了解它是做什么的,我们为什么要用它。不然看再多资料都理解不了,因此我们先来讲解下Spring Cloud Spring Cloud是一套微服务治理框架,几乎考虑到了微服务治理的方方面面。那么接下来具体说下 Spring…...

设计模式之原型模式Prototype的C++实现
1、原型模式提出 在软件功能设计中,经常面临着“某些结构复杂的对象”的创建工作,且创建的对象想拥有其他对象在某一刻的状态,则可以使用原型模型。原型模型是通过拷贝构造函数来创建对象,并且该对象拥有其他对象在某一刻的状态。…...

Java 中操作 Redis
文章目录 一、Redis 常用数据类型二、Redis 常用操作命令1. 字符串命令2. 哈希命令3. 列表命令4. 集合命令5. 有序集合命令6. 通用命令 三、在 Java 中操作 Redis1. 导入 maven 坐标2. 配置 Redis 数据源3. 编写配置类 四、在代码中的具体使用 一、Redis 常用数据类型 Redis 存…...

数据结构--最短路径 Dijkstra算法
数据结构–最短路径 Dijkstra算法 Dijkstra算法 计算 b e g i n 点到各个点的最短路 \color{red}计算\ begin\ 点到各个点的最短路 计算 begin 点到各个点的最短路 如果是无向图,可以先把无向图转化成有向图 我们需要2个数组 final[] (标记各顶点是否已…...

在 Linux 虚拟机上使用 Azure 自定义脚本扩展版本
参考 azure创建虚拟机,创建虚拟机注意入站端口规则开放80端口、 2.转到资源,点击扩展应用程序,创建存储账户,创建容器,上传文件,选择文件,会自动执行部署。 apt-get update -y && apt-get insta…...

W5500-EVB-PICO 做UDP Server进行数据回环测试(七)
前言 前面我们用W5500-EVB-PICO 开发板在TCP Client和TCP Server模式下,分别进行数据回环测试,本章我们将用开发板在UDP Server模式下进行数据回环测试。 UDP是什么?什么是UDP Server?能干什么? UDP (User Dataqram P…...
ES搜索引擎入门+最佳实践(九):项目实战(二)--elasticsearch java api 进行数据增删改查
本篇是这个系列的最后一篇了,在这之前可以先看看前面的内容: ES搜索引擎入门最佳实践(一)_flame.liu的博客-CSDN博客 ES搜索引擎入门最佳实践(二)_flame.liu的博客-CSDN博客 ES搜索引擎入门最佳实践(三)_flame.liu的博客-CSDN博客 ES搜索引擎入门最佳实践(四)_flame.liu的博…...

android内存分析工具记录,请利用好最后2个神器
相机见证了java内存暴增和native持续增长的问题,因此这里记录一下使用的工具情况,方便后续继续使用 一、java 内存 如果是java层的内存可以直接借助leakCanary工具,配置也很简单,直接在build.gradle中添加依赖即可: …...

安科瑞变电所运维平台在电力系统中应用分析
摘要:现代居民生活、工作对电力资源的需求量相对较多,给我国的电力产业带来了良好的发展机遇与挑战。探索电力系统基本构成, 将变电运维安全管理以及相应的设备维护工作系统性开展,能够根据项目实践工作要求,将满足要求…...

uniapp开发微信小程序使用painter将页面转换为图片并保存到本地相册
引言 我使用到painter的原因是,在uniapp开发微信小程序时,需要将一个页面的内容转换成图片保存到本地相册。 起初在网上找到很多都是在uniapp中使用 html2canvas 将网页转换成图片再jspdf将图片转换为pdf,但是这种方式在小程序环境不支持&am…...
790. 数的三次方根
文章目录 QuestionIdeasCode Question 给定一个浮点数 n ,求它的三次方根。 输入格式 共一行,包含一个浮点数 n 。 输出格式 共一行,包含一个浮点数,表示问题的解。 注意,结果保留 6 位小数。 数据范围 −10000≤…...

POSTGRESQL 关于2023-08-14 数据库自动启动文章中使用KILL 来进行配置RELOAD的问题解释...
开头还是介绍一下群,如果感兴趣Polardb ,mongodb ,MySQL ,Postgresql ,redis ,SQL SERVER ,ORACLE,Oceanbase 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请加 liuaustin3微信号 &…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...