[C++] 使用<random>头文件生成均匀分布、正态分布的数据
一、摘要
对于满足指定分布的自由变量,如果无法通过分布函数公式计算得到其期望和方差,可以考虑使用采样法得到其期望、方差值的近似值。在此过程中需要按照特定的分布函数进行随机采样,并统计采样数据,可以使用蒙特卡洛或者接受拒接方法得到满足特定分布的随机变量。本文简要介绍了如何使用C++random
头文件中自带的函数得到满足 均匀分布 和 高斯分布的变量 。
二、代码
0. c++中随机数生成的基本步骤
- 定义随机数生成器对象
gen
,random.h头文件中包含几个随机数生成器类,包括mt19937、default_random_engine等等。 - 定义随机数分布对象
dis
,randome头文件中包含了均匀分布(uniform_int_distribution,uniform_real_distribution)、正态分布(normal_distribution)等等几种常用分布类。 - 使用
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>头文件生成均匀分布、正态分布的数据相关推荐
- VC6生成随机浮点数、C++11的random头文件以及Dev C++支持C++11
生成随机数: c语言是用 stdlib.h 里面的 rand()函数: c++是 在 #include 里面的 std::random_device 类,该类重载了函数符号():根据资料random是 ...
- CMake2:版本号配置与头文件生成
1.基本测试 最基本的功能就是利用源代码文件生成一个可执行程序. CMakeLists.txt: cmake_minimum_required ( VERSION 3.5) project (Tuto ...
- C++无法在头文件中定义string类数据
//头文件中不仅要包含<string>,也要加上命名空间 //.h文件 #include <string> using namespace std; //或者使用 //std: ...
- C++中使用random头文件
//环境:请使用支持C++11的编译器,devC++,vs2013+,Clion #include <iostream> #include <random>int main() ...
- gsoap 学习 1-由wsdl文件生成h头文件
开始前先看一下用户向导吧 http://www.cs.fsu.edu/~engelen/soap.html 中左侧点击Documentation 英语水平确实有限,有些内容可能说的不准确,敬请参考向导 ...
- 【Android NDK 开发】Visual Studio 2019 使用 CMake 开发 JNI 动态库 ( 动态库编译配置 | JNI 头文件导入 | JNI 方法命名规范 )
文章目录 I . JNI 与 NDK 区别 II . Visual Studio 编译动态库 III. 配置 导入 jni.h 头文件 IV . IntelliJ IDEA Community Edi ...
- DSP篇--C6701 BOOT(头文件烧写法)
目录 1.简介 2.具体步骤 2.1编写应用程序工程 2.2生成头文件 2.2.1分析.dat和.h文件 2.2.2头文件生成器软件设计和开发 2.3加载flash烧写程序完成烧写过程 1.简介 这是 ...
- Tensorflow—TFRecord文件生成与读取
Tensorflow-TFRecord文件生成与读取 微信公众号:幼儿园的学霸 个人的学习笔记,关于OpenCV,关于机器学习, -.问题或建议,请公众号留言; 目录 文章目录 Tensorflow- ...
- static和头文件,源文件放什么
目录 头文件or源文件 1.局部静态变量 2.全局静态变量/普通的全局静态函数 3.静态数据成员.成员函数(面向对象) 头文件or源文件 a)头文件应该放: 1)普通的全局函数声明 2)普通的全局变量 ...
最新文章
- python使用HanLP进行句法分析实战
- 从DCGAN到SELF-MOD:GAN的模型架构发展一览
- SourceTree的基本使用
- 【客户下单】自动分单逻辑
- XML引入多scheme文件约束简单示例
- CTF Geek Challenge——第十一届极客大挑战Re Write Up
- android tag定义快捷键,Android Studio快捷键生成TAG、Log.x日志输出介绍
- OJ1045: 数值统计(c语言)
- 三维里面点击播放视频
- android textview 必填,在android中如何使用Html渲染的方式实现必填项前面的*号
- 原来真的不会用指针[*p++]
- 接待顾客接待久了,发现大家讨价还价的方式基本三种
- 常见For 循环优化方式总结——提高效率小妙招
- 如何给网页设置自己的字体
- ASP.NET选择题部分集合
- 计算机组成原理 课程设计报告
- php 输出七芒星,SongNet:硬格式控制下的文本生成
- 建筑施工复习资料-立杆基础
- XTU 1249 Rolling Variance
- 第7章 PKI和密码应用
热门文章
- ASP.NET三层架构中如何利用某些软件提高工作效率——动软代码生成器
- 使用Eclipse调试Java程序的10个技巧
- 低代码跑出了独角兽,通用平台靠什么?
- 无法打开文件 opencv_world452d.lib
- php使用curl请求后台接口
- MySQL ERROR 1064 (42000)——不管怎样grant总是报错,怎么回事?
- 【解决方案】rtsp/gb28181/ehome协议视频融合共享平台EasyCVR基于社区的人脸识别系统
- Json文件转换为Excel文件!涉及读文件,时间戳转化,写文档
- Cocos2d-x 3.10 使用BMFont 制作自定义位图字体.fnt文件
- 使用SFTPGo搭建SFTP服务器