C++ 偏微分数值计算库_ESYSim仿真器介绍之一 C++库介绍
本文档介绍在ESYSim仿真器中使用到的C++标准库或第三方库。
伪随机数产生器
伪随机数产生器是仿真器中非常常用的组件,比如片上网络中的负载产生器、片上网络中的随机仲裁器等。评价伪随机数的指标通常是重复周期,重复周期越长越好。同时,伪随机数的概率分布也很重要的。对于仿真器来说,伪随机数产生器需要在两个方面优化:
- 在完整仿真过程中,伪随机数序列都不发生重复。
- 当伪随机数足够多之后,伪随机数的概率分布趋近于期望的概率分布。
- 伪随机数的序列是确定的,即给定相同的种子,伪随机数序列可以复现。
C语言的stdlib.h
中提供了rand
函数用来产生[0, RAND_MAX)
范围内的整形伪随机数。这是C语言ANSI标准中提供了唯一伪随机数产生函数。
为了弥补C/C++语言在伪随机数方面的缺陷,Boost库提供了比较丰富的伪随机数生成函数库boost/random
。在C++11标准中,这个库从Boost库引入STL库中,头文件为#include <random>
。
与C语言不同,C++11的随机数生成器包含随机数产生器和随机数分布两个部分。根据随机数的生成方法,随机数产生器包括利用硬件随机数产生器构建的随机数设备random_device
,利用算法生成伪随机数的生成器(线性同余、梅森纠缠以及借位减法),以及通过调整伪随机数序列的伪随机数生成器(消除块和洗牌排序)。每一种生成器都可以通过设置种子来复现伪随机序列。
- 线性同余引擎(LCG)
linear_congruential_engine
。预设产生器minstd_rand0
和minstd_rand
。 - 梅森纠缠引擎(Mersenne Twister)
mersenne_twister_engine
。预设产生器mt19937
和mt19937_64
。 - 借位减法引擎(Subtract with carray)
subtract_with_carry_engine
。预设产生器ranlux24_base
和ranlux48_base
。 - 消除块引擎(Discard)
discard_block_engine
。预测产生器ranlux24
和ranlux48
。 - 洗牌排序引擎(Shuffle)
shuffle_order_engine
。 预测产生器knuth_b
。
C++11提供的随机数分布包括均匀分布、伯努利分布(二项分布)、泊松分布、正态(高斯)分布以及采样分布。如果需要使用随机数分布,首先利用随机数产生器得到一个均匀分布的随机数;然后再通过随机数分布映射到需要的概率分布。
- 均匀分布:
uniform_int_distribution
(整数均匀分布)和uniform_real_distribution
(浮点均匀分布)。 - 伯努利分布:
bernoulli_distribution
、binomial_distribution
、negative_binomial_distribution
、geometric_distribution
。 - 泊松分布:
poisson_distribution
、exponential_distribution
、gamma_distribution
、weibull_distribution
、extreme_value_distribution
。 - 正态分布:
normal_distribution
、lognormal_distribution
、chi_squared_distribution
、cauchy_distribution
、fisher_f_distribution
、student_t_distribution
。 - 采样分布:
discrete_distribution
、piecewise_constant_distribution
、piecewise_linear_distribution
。
ESYSim中的randgen
模块
ESYSim中的randgen
模块用来为仿真过程产生随机数。这个模块的C++源文件和SWIG文件在路径srcs/rangen
中;python封装和测试文件在路径python/randgen
。
使用randgen
模块,需要创建EsyRandGen
对象。创建EsyRandGen
对象需要制定随机数的种子和随机数的生成算法。
EsyRandGen(long a = 1, RandGenAlg alg = C11_DEFAULT);
随机数的生成算法用枚举变量RandGenAlg
表示。EsyRandGen
选择对应的C++11随机数生成器产生随机数。 RandGenAlg
定义如下。
enum RandGenAlg{C11_DEVICE = 1,C11_MINSTD_RAND0 = 2,C11_MINSTD_RAND = 3,C11_MT19937 = 4,C11_MT19937_64 = 5,C11_RANLUX24_BASE = 6,C11_RANLUX48_BASE = 7,C11_RANLUX24 = 8,C11_RANLUX48 = 9,C11_KNUTH_B = 10};
如果创建EsyRandGen
对象时提供的alg
不属于上面的枚举类型,则EsyRandGen
采用C语言标准定义的rand
函数产生随机数。
EsyRandGen
对象提供两类分布:均匀分布和高斯(正态)分布。由于C++是强类型语言,EsyRandGen
提供了不同的函数用来产生不同数据范围的随机数。
- 生成均匀分布的函数如下:
double flatDouble(double low, double high);
long flatLong(long low, long high);
unsigned long flatUnsignedLong(unsigned long low, unsigned long high);
unsigned long long flatUnsignedLongLong(unsigned long long low, unsigned long long high);
每一个函数产生在[low, high)
之间的一个随机数。
- 生成高斯分布的函数如下:
double gaussDouble(double mean, double variance);
long gaussLong(long mean, double variance);
unsigned long gaussUnsignedLong(unsigned long mean, double variance);
unsigned long long gaussUnsignedLongLong(unsigned long long mean, double variance);
函数产生的高斯分布满足均值为mean
而且方差为variance
。
randgen
模块的测试
randgen
模块的测试程序在路径python/randgen/test.py
。 由于使用的是C和C++11官方提供的随机数生成器,所以我们默认了伪随机序列的重复性能够满足要求,不进行测试。我们着重测试的是生成的随机序列的概率分布。测试程序采用最为基本的均匀分布的概率分布作为测试项目。
测试程序会测试由不同随机数生成算法得到的均匀分布的方差和执行速度。测试程序使用flatUnsignedLong
产生规定范围内的整形随机数。统计产生的随机数,可以得到每一个数值出现的频次,对频次求方差作为均匀分布的方差。
均匀分布的范围由min_range
和max_range
确定;每一种随机数产生算法需要对seed_count
种随机数种子进程测试;每一个随机数产生算法和随机数种子的测试需要产生number
个随机数。
根据网络负载产生的场景,我们假设:均匀分布的范围是[0, 99)
;总共测试50
个随机数种子;并且每组测试的随机数为100000
个随机数。经过多次测试,C语言标准函数rand
以及Minstd_rand0
、Ministd_rand
、Mt19937
和Mt19937_64
四种算法的方差接近,一般都是小于0.001。具体数值随随机数种子波动。另外5种方法的方差较大,一般都大于0.001。
执行时间上,C语言标准函数rand
的执行时间最小;Minstd_rand0
、Ministd_rand
、Mt19937
和Mt19937_64
四种算法的执行时间大于rand
。另外5种方法的执行时间较大。
此外,我们发现不同算法的最大偏差(某个数值出现的频次相对于理想均匀分布的频次的偏差)相对稳定(大于10%),并且无法下降。用于片上网络仿真器,这是一个较大的缺陷。如果用这样的随机数产生通信负载,某个目标地址可能比其他地址少10%的通信流量;或者多10%的通信流程。本人才疏学浅,暂时没有找到能够获得最大偏差更小的随机数算法。
C++ 偏微分数值计算库_ESYSim仿真器介绍之一 C++库介绍相关推荐
- Python-EEG工具库MNE中文教程(13)-“bad“通道介绍
目录 标记坏频道/标记不良通道(marking bad channels) 本分享为脑机学习者Rose整理发表于公众号:脑机接口社区 .QQ交流群:903290195 本教程主要介绍手动标记坏通道以及 ...
- vue组件库介绍以及组件库Element UI 的使用
组件库 前言 这篇文章介绍vue组件库! 介绍什么是组件库以及Element UI组件库的使用! 看完不会你打我.哈哈哈,开玩笑的,不多说,上刺刀!! 1. 什么是 vue 组件库 在实际开发中,前端 ...
- lua(1):lua,luarocks介绍及lua库安装
先说安装,然后在BB几大组建,目前除了tolua和wxlua用过外其他没用过: 一:安装: Linux下安装方法:借助luarocks安装工具 方法1: 1. 安装lua运行环境:$sudo apt- ...
- python什么意思v_稍微介绍下python库之VPython
额,~!@###@$$#@ VPython是不属于标准Python库的,它是个第三方库.地址在 http://www.vpython.org/. VPython可以很好地进行3D快速原型的开发.比Op ...
- python标准库的图像处理模块_Python图像处理库PIL的ImageFont模块使用介绍
ImageFont模块定义了相同名称的类,即ImageFont类.这个类的实例存储bitmap字体,用于ImageDraw类的text()方法. PIL使用自己的字体文件格式存储bitmap字体.用户 ...
- 学习笔记:点云库PCL(Point Cloud Library )介绍
本文简要介绍点云库(PCL),一个用于处理2D和3D数据的开源库,如激光雷达点云. 通过熟悉使用PCL的一些基础知识,以便后续使用PCL进行定位.主要涵盖以下内容: 点云数据Point Cloud D ...
- Fresco图片加载框架的介绍,相关开源库以及工具类的封装
Fresco图片加载框架的介绍,相关开源库以及工具类的封装 本文已授权微信公众号:鸿洋(hongyangAndroid)在微信公众号平台原创首发. 简介 Fresco 是Facebook开源的安卓上的 ...
- 【Linux篇】第十一篇——动静态库(动静态库的介绍+动静态库的打包与使用)
动静态库的基本原理 认识动静态库 动静态库的概念 静态库的打包与使用 静态库的打包 静态库的使用 动态库的打包与使用 动态库的打包 动态库的使用 动静态库的基本原理 动静态库的本质就是可执行程序的&q ...
- pythonrequests爬虫外文文献_Python爬虫(一):爬虫介绍、Requests库介绍及实例-Go语言中文社区...
本文主要内容: 1.爬虫的相关概念. 2.Requsets库安装. 3.Requests库介绍. 4.爬取网页的通用代码框架. 1.爬虫相关概念. 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社 ...
最新文章
- ajax对服务器路径请求
- 互联网大脑如何产生“梦境“并形成元宇宙
- 【Mrak】C# 文本文件 ANSI编码格式 转 UTF8
- DLL注入-APC注入
- LA3989女士的选择
- [Xcode 实际操作]七、文件与数据-(2)创建文件夹
- 【面向对象】面向对象程序设计测试题8-对象之间one-to-many关系测试题
- vb.net 判断是否为ip 正则_什么是个人IP科学定位?标准答案来了|ip|直播|科学|ip魔方...
- 服务器返回文件格式,iOS开发--服务器返回的数据解析
- 机器学习-吴恩达-笔记-7-机器学习系统的设计
- binder 从c到java_Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析...
- PyQt4---QTextBrowser
- 2020.11.16-使用Arduino测速
- python删除数组元素remove_python如何对数组删除元素
- Linux用shell判断闰年,用Shell计算闰年
- cordova 插件cordova-plugin-crosswalk-webview - Android 集成crosswalk浏览器内核
- mvc 框架ember.js的简单介绍
- 280. 陪审团 - AcWing (拔河DP,反推过程)
- 最新kali之john
- 金昌JCH文件批量转BMP/JPG图片脚本