[C++] 使用<random>头文件生成均匀分布、正态分布的数据

本文主要是介绍[C++] 使用<random>头文件生成均匀分布、正态分布的数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、摘要

对于满足指定分布的自由变量,如果无法通过分布函数公式计算得到其期望和方差,可以考虑使用采样法得到其期望、方差值的近似值。在此过程中需要按照特定的分布函数进行随机采样,并统计采样数据,可以使用蒙特卡洛或者接受拒接方法得到满足特定分布的随机变量。本文简要介绍了如何使用C++random头文件中自带的函数得到满足 均匀分布高斯分布的变量 。

二、代码

0. c++中随机数生成的基本步骤

  1. 定义随机数生成器对象gen,random.h头文件中包含几个随机数生成器类,包括mt19937、default_random_engine等等。
  2. 定义随机数分布对象dis,randome头文件中包含了均匀分布(uniform_int_distribution,uniform_real_distribution)、正态分布(normal_distribution)等等几种常用分布类。
  3. 使用dis(gen)产生一个满足dis分布的随机变量。

random头文件中关于随机数生成器、分布类的详细信息请参考cplusplus官网。

1. 均匀分布代码

#include <iostream>
#include <random>
#include <time.h>
using namespace std;
int main() {mt19937 gen((unsigned int) time(nullptr)); // 定义随机数生成器对象gen,使用time(nullptr)作为随机数生成器的种子uniform_real_distribution<double> dis(-1.0, 1.0); // 定义随机数分布器对象dis,为在[-1.0,1.0]区间内的均匀分布for (int i = 0; i < 10; i++) {cout << dis(gen) << endl;}return 0;
}

输出结果为:

0.946503
0.823232
0.340609
0.634292
-0.499202
0.350881
0.925468
-0.914869
-0.648034
-0.36995

2. 高斯分布代码

#include <iostream>
#include <random>
#include <time.h>
using namespace std;
int main() {mt19937 gen((unsigned int) time(nullptr)); // 定义随机数生成器对象gen,使用time(nullptr)作为随机数生成器的种子normal_distribution<double> dis(0.0, 1.0); // 定义随机数分布器对象dis,期望为0.0,标准差为1.0的正态分布for (int i = 0; i < 10; i++) {cout << dis(gen) << endl;}return 0;
}

输出结果为:

-0.188695
0.0804475
-0.647262
-0.0837869
0.84727
-0.115599
0.836252
0.821125
-2.17249
2.01725

三、注意事项

读者可能会遇到下面的代码(比如在[C++11]C++11带来的随机数生成器中介绍了这种在linux下的随机数生成方式):

int main{...random_device rd;mt19937 gen(rd());for (int i = 0; i < 10; i++) {cout << gen() << endl;}...return 0;
}

该代码在Linux下运行正常,但是在windows下每次运行的结果都相同。比如在我的windows电脑上两次运行的结果都是:

2412496532
3119216746
1495923606
3931352601
26313293
2552602825
3745457912
2213446826
4119067789
4188234190

在[C++11]C++11带来的随机数生成器中讲这是因为在windows下random_device使用的是rand_s,因此本博客中使用time(nullptr)作为种子。

同时[C++11]C++11带来的随机数生成器和c/c++产生随机数这两篇文章写得很好,很有参考价值。

四、参考引用

[1].cplusplus官网
[2].[C++11]C++11带来的随机数生成器
[3].c/c++产生随机数

这篇关于[C++] 使用<random>头文件生成均匀分布、正态分布的数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Python 字典 (Dictionary)使用详解

《Python字典(Dictionary)使用详解》字典是python中最重要,最常用的数据结构之一,它提供了高效的键值对存储和查找能力,:本文主要介绍Python字典(Dictionary)... 目录字典1.基本特性2.创建字典3.访问元素4.修改字典5.删除元素6.字典遍历7.字典的高级特性默认字典

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

python生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

C++中全局变量和局部变量的区别

《C++中全局变量和局部变量的区别》本文主要介绍了C++中全局变量和局部变量的区别,全局变量和局部变量在作用域和生命周期上有显著的区别,下面就来介绍一下,感兴趣的可以了解一下... 目录一、全局变量定义生命周期存储位置代码示例输出二、局部变量定义生命周期存储位置代码示例输出三、全局变量和局部变量的区别作用域

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态