C++初学者指南-5.标准库(第二部分)–随机数生成
C++初学者指南-5.标准库(第二部分)–随机数生成
文章目录
- C++初学者指南-5.标准库(第二部分)–随机数生成
- 基本概念
- 例子
- 统一随机数
- 布尔值(“抛硬币”)
- 正态分布
- 具有独立概率的整数
- 怎么做
- 种子引擎
- 使用自定义生成器
- shuffle算法
- 分布类型概述
- 通用接口
- 均匀分布
- 采样分布
- 伯努利分布
- 正态分布
- 泊松分布
- 概览表
- 引擎类型概述
- 通用引擎接口
- 相关内容
基本概念
#include <random>
random_engine_type engine {seed};
distribution_type distribution {parameters,…};
auto random_value = distribution(engine);
随机性的来源与分布是解耦的。
- 随机数是由分布产生的
- 分布使用均匀随机位引擎作为随机性源
此设计的优点
- 没有单个全局状态,可以使用多个独立的随机引擎
- 新的分发类型可以使用现有引擎
- 可以更改随机性源,同时保持分布类型 (例如,将确定性引擎更改为使用硬件熵的引擎)
例子
统一随机数
#include <random>
// fixed seed(固定种子)
auto const seed = 123;
// Mersenne Twister random engine(梅森旋转随机引擎):
std::mt19937 urbg {seed};
// generate random ints ∈ [1,6](生成1-6之间的随机整数)
std::uniform_int_distribution<int> distr1 {1, 6};
auto const value1 = distr1(urbg);
auto const value2 = distr1(urbg);
// generate random floats ∈ [-1.2,6.25)(生成-1.2到6.25之间的随机浮点数)
std::uniform_real_distribution<float> distr2 {-1.2f, 6.25f};
auto const value3 = distr2(urbg);
运行示例代码
布尔值(“抛硬币”)
#include <random>
auto const seed = 123;
auto urbg = std::mt19937 {seed};
// unfair coin (40% 'true'):
double const p = 0.4;
auto flip = std::bernoulli_distribution{p};
if (flip(urbg)) // 40% chancecout << "heads\n";
else // 60% chancecout << "tails\n";
运行示例代码
正态分布
#include <random>
auto const seed = 123;
auto urbg = std::mt19937 {seed};
double const mu = 4.0;
double const sigma = 0.7;
auto norm = std::normal_distribution<double>{mu,sigma};
auto value = norm(urbg);
运行示例程序
具有独立概率的整数
#include <random>
auto const seed = std::random_device{}();
auto urbg = std::mt19937{seed};
std::vector<double> ws {1.0, 1.5, 0.5, 2.0};
std::discrete_distribution<int> distr {begin(ws), end(ws)};
std::vector<int> histo (ws.size(), 0);
int const N = 100000;
for (int k = 0; k < N; ++k) {auto const i = distr(urbg);++histo[i];
}
std::cout << "Histogram:\n";
for (auto x : histo) {auto const size = int(30 * x/double(N));cout << std::string(size,'-') << "o\n";
}
运行示例程序
怎么做
种子引擎
- 使用一个整数类型的 engine_type::result_type
- 或使用种子序列
- 在构造函数中: engine_type { seed }
- 或者使用成员函数 .seed( seed };
#include <random>
#include <chrono> // clocks
auto e = std::mt19937{};
// seed engine with a constant
e.seed(123);
// … or with system clock ticks
auto const ticks = std::chrono::system_clock::now().time_since_epoch().count();
e.seed(ticks);
// … or with hardware entropy
auto const hes = std::random_device{}();
e.seed(hes);
// … or with a seed sequence
std::seed_seq s {1,5,3,7,0,9};
e.seed(s);
auto distr = std::uniform_real_distribution{-11.0, 15.3};
cout << distr(e) << '\n';
运行示例代码
使用自定义生成器
Lambda生成器
- 在 lambda 捕获中初始化引擎和分发
- 重要:lambda 必须标记为 mutable 因为内部状态 引擎和分配需要随着每次调用而改变
#include <random>
auto const seed = std::random_device{}();
auto coin_flip = [// init-capture engine + distribution:urbg = std::mt19937{seed},distr = std::bernoulli_distribution{0.5}
]() mutable -> bool { return distr(urbg); };
// use generator:
cout << coin_flip() << '\n';
auto roll = [urbg = std::mt19937{seed},distr = std::uniform_int_distribution<int>{1,6}
]() mutable -> int { return distr(urbg); };
cout << roll() << '\n';
运行示例程序
自定义生成器类
如果需要对参数进行更多控制
#include <random>
class DiceRoll {using engine_type = std::mt19937;// engine + distribution as members:engine_type urbg_;std::uniform_int_distribution<int> distr_;
public:using seed_type = engine_type::result_type;// constructor:explicit DiceRoll (int sides, seed_type seed = 0) noexcept: urbg_{seed}, distr_{1,sides} {}// allows to re-seedvoid seed (seed_type s) noexcept { urbg_.seed(s); }// call operator:int operator () () noexcept { return distr_(urbg_); }
};int main () {auto const seed = std::random_device{}();DiceRoll roll_d20 {20, seed};std::cout << roll_d20() << '\n';
}
运行示例程序
shuffle算法
cppreference
#include <algorithm>
#include <random>
// 32 bit mersenne twister engine
auto const seed = std::random_device{}();
auto reng = std::mt19937{seed};
std::vector<int> v {0,1,2,3,4,5,6,7,8};
shuffle(begin(v)+2, begin(v)+7, reng);
for (int x : v) { cout << x <<' '; } // 0 1 … 7 8
运行示例代码
分布类型概述
通用接口
构造
- distribution_type distr; // with default params
- distribution_type distr { parameter_object };
- distribution_type distr { parameter1, parameter2,… parameterN };
生成值
auto random_value = distribution_object(engine_object);
常见访问器
- distr.min() → smallest obtainable value(可获得的最小值)
- distr.max() → largest obtainable value(可获得的最大值)
- distr.param() → parameter object(参数对象)
- distr.reset() : reset internal state(复位内部状态)
参数对象
- distribution_type::param_type pars { parameter1, parameter2,… parameterN };
- distribution_type distr1 { pars };
- distribution_type distr2 { pars };
- distribution_type distr3 { distr1.param() };
分布-特定参数访问器
distr.a() .b() .m() .n() .s() .alpha() .beta() .lambda() .mean() .stddev() …
均匀分布
采样分布
伯努利分布
正态分布
泊松分布
概览表
引擎类型概述
通用引擎接口
线性同余引擎
std::minstd_rand0 // 1969 by Lewis, Goodman, Miller
std::minstd_rand // 1993 by Park, Miller, Stockmeyer
std::linear_congruential_engine
梅森旋转引擎
std::mt19937 // 32-bit, Matsumoto and Nishimura, 1998
std::mt19937_64 // 64-bit, Matsumoto and Nishimura, 2000
std::mersenne_twister_engine
带进位的减法引擎
std::ranlux24_base
std::ranlux48_base
std::subtract_with_carry_engine
引擎适配器
std::discard_block_engine
std::independent_bits_engine
std::shuffle_order_engine
基于适配器的引擎:
std::ranlux24 // discard_block_engine
std::ranlux48 // discard_block_engine
std::knuth_b // shuffle_order_engine
std::default_random_engine
取决于编译器/平台;通常是线性同余生成器。
非确定性熵源
std::random_device
表示一个非确定性随机数生成器,例如,使用硬件熵源。
如果没有可用的非确定性熵源,标准库的实现可以使用伪随机数引擎作为random_device。
测试设备是否真正是非确定性的:std::random_device rd; bool non_deterministic = rd.entropy() > 0; bool deterministic = rd.entropy() == 0; auto distr = std::uniform_real_distribution{-1.0,1.0}; auto num = distr(rd);
注意:一些(较旧的)标准库实现尽管其随机设备是非确定性的,但仍然返回0。
相关内容
Random Generator: Combining Engine + Distribution
Random Number Sequences: Control Reproducibility
cppreference: Pseudo-Random Number Generation
cppreference: std::generate_canonical
What C++ Programmers Need to Know about Header (Walter E. Brown, 2016)
附上原文链接
如果文章对您有用,请随手点个赞,谢谢!^_^
相关文章:

C++初学者指南-5.标准库(第二部分)–随机数生成
C初学者指南-5.标准库(第二部分)–随机数生成 文章目录 C初学者指南-5.标准库(第二部分)–随机数生成基本概念例子统一随机数布尔值(“抛硬币”)正态分布具有独立概率的整数 怎么做种子引擎使用自定义生成器 shuffle算法分布类型概述通用接口均匀分布采样…...
Unity2017在安卓下获取GPS位置时闪退的解决办法
在Unity使用低功耗蓝牙通信(BLE)需要用到设备的位置信息。但是调用Input.location.Start()程序会闪退。 解决办法:调用原生安卓接口。 参见《Unity2021通过aar调用Android方法》编写一个aar插件gpsplugin,在插件中提供获取GPS位…...

OpenGL ES 索引缓冲区(4)
OpenGL ES 索引缓冲区(4) 简述 本节会介绍索引缓冲区,索引缓冲区和顶点缓冲区类似,也是显存上的一段内存,只不过上面的数据用处不同,索引缓冲区故名思义里面的数据是用于索引,主要作用是用于复用顶点缓冲区里的数据。…...

01:(寄存器开发)点亮一个LED灯
寄存器开发 1、单片机的简介1.1、什么是单片机1.2、F1系列内核和芯片的系统架构1.3、存储器映像1.4、什么是寄存器 2、寄存器开发模板工程3、使用寄存器点亮一个LED4、代码改进15、代码改进2 本教程使用的是STM32F103C8T6最小系统板,教程来源B站up“嵌入式那些事”。…...
.Net 6.0 Windows平台如何判断当前电脑是否联网
最近在工作中开发需要判断当前电脑是否联网的需求,在网上找了一个调用window API来判断本机是否联网。具体请看下面介绍: 1.方法一(调用winAPI) [DllImport("wininet")] public static extern bool InternetGetConnec…...

微软准备了 Windows 11 24H2 ISO “OOBE/BypassNRO“命令依然可用
Windows 11 24H2 可能在未来几周内开始推出。 微软已经要求 OEM 遵循新的指南准备好 Windows 11 24H2 就绪的驱动程序,并且现在已经开始准备媒体文件 (.ISO)。 OEM ISO 的链接已在微软服务器上发布。 一个标有"X23-81971_26100.1742.240906-0331.ge_release_sv…...
MacOS 终端执行安装 Brew
在配置新的 Mac 环境时,如果你发现终端中无法识别 brew 命令,可以按照以下步骤进行解决。 步骤 1:确保网络稳定 为了避免安装过程中出现中断,建议使用 Wi-Fi 或有线连接,不推荐使用移动网络。 步骤 2:打…...

【设计模式-解释模式】
定义 解释器模式是一种行为设计模式,用于定义一种语言的文法,并提供一个解释器来处理该语言的句子。它通过为每个语法规则定义一个类,使得可以将复杂的表达式逐步解析和求值。这种模式适用于需要解析和执行语法规则的场景。 UML图 组成角色…...

51单片机应用开发(进阶)---数码管+按键+蜂鸣器(电磁炉显示模拟)
实现目标 1、加强数码管、按键的学习,实现数码显示变量数据(四位数的显示); 2、4位数码2个按键无源蜂鸣器实现模拟电磁炉功率调节及显示; 一、内容描述 功能描述:1、开机显示电磁炉功率300,每…...

Emergency Stop (ES)
文章目录 1. 介绍2. Feature List3. 紧急停止信号触发方式3.1 Port触发紧急停止信号3.2 SMU事件触发紧急停止信号3.3 软件触发紧急停止信号 4. 应用场景4.1 Port4.2 MSC 1. 介绍 Emergency Stop (ES)是Ifx System Control Units (SCU)六大模块之一。详细信息可以参考Infineon-…...
[C++][第三方库][gtest]详细讲解
目录 1.介绍2.安装3.使用1.头文件包含2.框架初始化接口3.调用测试样例4.TEST宏5.断言宏6.示例 1.介绍 gtest是一个跨平台的C单元测试框架,由Google公司发布gtest是为了在不同平台上为编写C单元测试而生成的,它提供了丰富的断言、致命和非致命判断、参数…...

【Java数据结构】 链表
【本节目标】 1. ArrayList 的缺陷 2. 链表 3. 链表相关 oj题目 一. ArrayList的缺陷 上节课已经熟悉了ArrayList 的使用,并且进行了简单模拟实现。通过源码知道, ArrayList 底层使用数组来存储元素: public class ArrayList<E>…...

前端——Ajax和jQuery
一、Ajax Ajax即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML), 通过 JS 异步的向服务器发送请 求并接收响应数据。 同步访问:当客户端向服务器发送请求时,服务器在处理的过程中,浏览器…...

C++-vector模拟实现
###vector底层相当于是数组,查看源码可以发现,这个类的私有成员变量是三个迭代器;在实现时迭代器就可以当作是vector里面的元素的指针类型; ###vector是一个类模板,实现时也应当按照这样的写法用一个模板去实现&#…...

Activity
69[toc] 1.启停活动页面 1.Activity启动和结束 从当前页面跳到新页面 startActivity(new Intent(this, ActFinishActivity.class));从当前页面返回上一个页面,相当于关闭当前页面 finish();2.Activity生命周期 官方描述生命周期 onCreate:创建活…...
【力扣 | SQL题 | 每日四题】力扣1581, 1811, 1821, 1831
今天的题目就1811这个比较难,其他非常的基础。 1. 力扣1581:进店却未进行过交易的顾客 1.1 题目: 表:Visits ---------------------- | Column Name | Type | ---------------------- | visit_id | int | | customer…...
洛谷【P1955 [NOI2015] 程序自动分析】
反思: 这道题一眼就是并查集 但是数据太大 mle和re都是有可能的我看了题解才知道是离散化数组加并查集离散化再两个月前我觉得好难啊 那道题跟本看不懂 现在觉得还行 离散化思路: 需要一个离散记录数组----ls[N]用来记录下出现的数 步骤: …...

Swift并发笔记
1.同步和异步 说到线程的执行方式,最基本的一组概念是同步和异步。所谓同步,就是在操作执行完成之前,运行操作的这个线程都会被占用,直到函数最终被抛出或返回。Swift5.5之前,func关键字声明的所有的函数都是同步的。…...
React 组件命名规范
在 React 项目中,如果希望保持组件命名的一致性,并防止在引入时出现不同名称的问题,可以遵循以下的组件规范: 1、默认导出组件: 所有特殊要求的组件(如页面组件或根组件)应该使用 export defau…...
eNSP网络配置指南:IP设置、DNS、Telnet、DHCP与路由表管理
1.eNSP基本操作和路由器IP配置命令 登录设备:通过Console口或通过eNSP的Telnet/SSH客户端登录到设备。进入特权模式:输入system-view进入系统视图。接口配置: 进入接口视图,例如interface GigabitEthernet0/0/0。配置IP地址和子网…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...