c语言计算随机数分布概率,C++ piecewise_constant_distribution分段常数分布随机数用法详解...
piecewise_constant_distribution 模板定义了一个在一组分段子区间生成浮点值的分布。给定子区间内的值是均匀分布的,每个子区间都有自己的权重。n 个区间边界可以定义 n-1 个子区间和 n-1 个可以运用到子区间的权重,由这 n 个区间边界定义一个对象,图 1 说明了这一点。
图 1 中的分布定义了 3 个区间,每个都有自己的权重。这 3 个区间是由定义在容器 b 中的 4 个边界值定义的。每个区间都有一个由容器 w 中的元素定义的权重。它的前两个参数是指定边界序列的迭代器,第三个参数是指向权重序列的第一个元素的迭代器。每个区间内的值都是均勻分布的,特定区间内的随机值的概率是由这个区间的权重决定的。
图 1 分段常数分布
除了所有分布都实现的成员函数之外,piecewise_constant_distribution 还有成员函数 intervals() 和 densities(),它们分别返回区间的边界和区间内值的概率密度;这两个函数返回的值都是 vector 容器。通过尝试和图 1 所示的相似的分布,我们可以运用这些成员,并深入了解这个分布的效果。但区间很狭窄,因此输出需要的空间很少:
// Demonstrating the piecewise constant distribution
#include // For distributions and random number generator
#include // For vector container
#include // For map container
#include // For pair type
#include // For copy(), count(), remove()
#include // For standard streams
#include // For stream iterators
#include // For stream manipulators
#include // For string class
using std::string;
int main()
{
std::vector b {10, 20, 35, 55}; // Intervals: 10-20, 20-35, 35-55
std::vector w {4, 10, 6}; // Weights for the intervals
std::piecewise_constant_distribution<> d {std::begin(b), std::end(b), std::begin(w)};
// Output the interval boundaries and the interval probabilities
auto intvls = d.intervals();
std::cout << "intervals: ";
std::copy(std::begin(intvls), std::end(intvls), std::ostream_iterator{std::cout, " "});
std::cout << " probability densities: ";
auto probs = d.densities();
std::copy(std::begin(probs), std::end(probs), std::ostream_iterator{std::cout, " "});
std::cout << '\n' << std::endl;
std::random_device rd;
std::default_random_engine rng {rd()};
std::map results; //Stores and counts random values as integers
// Generate a lot of random values...
for(size_t i {}; i < 20000; ++i)
++results[static_cast(std::round(d(rng)))];
// Plot the integer values
auto max_count = std::max_element(std::begin(results), std::end(results),[](const std::pair& pr1, const std::pair& pr2)
{ return pr1.second < pr2.second; })->second;
std::for_each(std::begin(results), std::end(results),[max_count](const std::pair& pr)
{ if(!(pr.first % 10)) // Display value if multiple of 10
std::cout << std::setw(3) << pr.first << "-|";
else
std::cout << " |";
std::cout << std::string(pr.second * 80 / max_count, '*')<< '\n'; });
}
这样就生成了一个我们之前看到的区间和权重的分布,并用这个分布生成了大量的值,然后在将它们转换为整数后,将这些值的出现频率绘制成直方图。值会在页的下面运行,条形图从左到右地表示相对频率。
该程序的输出如下:
intervals: 10 20 35 55 probability densities: 0.02 0.0333333 0.015
10-|***********************
|***********************************************
|****************************************
|*******************************************
|**********************************************
|********************************************
|**********************************************
|**********************************************
|***********************************************
|********************************************
20-|**********************************************************
|************************************************************************
|**************************************************************************
|***************************************************************************
|******************************************************************************
|*****************************************************************************
|********************************************************************************
|***********************************************************************
|****************************************************************************
|***************************************************************************
30-|**************************************************************************
|*******************************************************************************
|******************************************************************************
|*************************************************************************
|***************************************************************************
|*******************************************************
|**********************************
|*********************************
|******************************
|***********************************
40-|***********************************
|**********************************
|********************************
|*******************************
|******************************
|***********************************
|*********************************
|******************************
|********************************
|**********************************
50-|*************************************
|*******************************
|*********************************
|*********************************
|*********************************
|***************
输出中有趣的地方是概率密度的值,以及第一个和最后一个区间内条形图的相对长度。这两个区间的权重分别为 4 和 6,因此值在第一个区间的概率是 4/20,也就是 0.2;值在第二个区间的概率为 10/20,也就是 0.5;值在最后一个区间的概率是 6/20,也就是 0.3。然而,最后一个区间输出的条形图低于第一个区间,这似乎和概率有些矛盾。无论如何,输出中的概率密度都是不同的,为什么会这样?
原因在于它们是不同的。概率密度是区间内给定值出现的概率,而不是随机值出现在区间内的概率,一个值的概率密度与区间值出现概率除以区间的值的范围是对应的。因此,这个 3 个区间内值的概率密度分别为 0.2/10、0.5/15、0.3/20,幸运的是,这和输出是相同的。最后一个区间得到的值恰好是第一个区间的两倍,但它所跨越的范围更大,因此条形图更短。因此,条形图的长度反映了概率密度。
c语言计算随机数分布概率,C++ piecewise_constant_distribution分段常数分布随机数用法详解...相关推荐
- html语言中注释标记,html注释代码<!--......--> 标签的用法详解
别小看了简单的html注释代码标签,它的作用还是挺大的,对于复杂而庞大的代码量,有必要在需要说明,备注,解释的地方插入一些注释内容,方便以后编辑.修改.查询代码,还可以对某些不需要显示或执行的代码进行 ...
- c语言随机变量seed,如何产生随机数?C语言rand()和srand()用法详解
在实际编程中,我们经常需要生成随机数.因此rand()与srand()出现了,本文详解随机数相关内容 一.rand()函数相关 函数头文件:stdlib.h 函数定义:int rand(void) 函 ...
- 784-C语言rand和srand用法详解
C语言rand和srand用法详解 在实际编程中,我们经常需要生成随机数,例如,贪吃蛇游戏中在随机的位置出现食物,扑克牌游戏中随机发牌. 在C语言中,我们一般使用 <stdlib.h> 头 ...
- sizeof 在C语言的作用,C语言中的sizeof的用法详解
C语言中的sizeof的用法详解 一.sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等.它并不是函数.sizeof操作符以字节形式给出了其操作数的存储大小.操 ...
- c语言struct的作用和用法,c语言struct用法详解
c语言struct用法详解 在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据.结构体的定义形式为:struct 结构体名{ 结构体所包含的变量或数组 }; 结构体是一种集合,它里面包 ...
- c语言while将字符循环,C语言 while语句的用法详解
在C语言中,共有三大常用的程序结构: 顺序结构:代码从前往后执行,没有任何"拐弯抹角": 选择结构:也叫分支结构,重点要掌握 if else.switch 以及条件运算符: 循环结 ...
- R语言使用survminer包生存分析及可视化(ggsurvplot)实战详解:从数据集导入、生存对象生成、ggsurvplot可视化参数配置、设置、可视化对比
R语言使用survminer包生存分析及可视化(ggsurvplot)实战详解:从数据集导入.生存对象生成.ggsurvplot可视化参数配置.设置.可视化对比 目录 R语言使用survminer包生 ...
- php函数find的用法,c语言find函数的用法详解
c语言find函数的用法详解 C语言之find()函数 find函数用于查找数组中的某一个指定元素的位置. 比如:有一个数组[0, 0, 5, 4, 4]: 问:元素5的在什么位置,find函数 返回 ...
- c语言常量的正确表示const,C语言中的const和free用法详解
注意:C语言中的const和C++中的const是有区别的,而且在使用VS编译测试的时候.如果是C的话,请一定要建立一个后缀为C的文件,不要是CPP的文件.因为,两个编译器会有差别的. 一.C语言中的 ...
最新文章
- 图像有损压缩matlab程序,基于Matlab的灰度图像DCT与RLE的混合有损压缩
- L1正则化为什么又叫做稀疏因子?
- 变步长龙格库塔法matlab代码,matlab 龙格库塔法 变步长龙格库塔法.doc
- c语言常用数据类型所占用的字节数
- AI理论知识基础(19)-线性变换(1)
- gin 生成api文档_gin-swagger 生成RESTful风格OpenAPI文档
- 用jQuery实现一些导航条切换,显示隐藏
- linux shell学习笔记(二) 变量和运算符
- return 输出为空php,thinkphp5 返回json数据的方法---以及返回json为空的原因
- 漫谈 - 从技术业务骨干走向管理
- 【重点】LeetCode 146. LRU Cache
- vba 添加outlook 签名_在Excel 2013中使用vba插入电子邮件签名
- 安装cude11.2.exe报错:Could not create file “C: )Users\xxx\ AppData \Local\ Temp \CUDA\GFExperience
- SharepointDesigner创建一个工作流
- DNS?本地填写的DNS有什么用?DNS怎么工作的?
- GameFramework篇:AssetsBundle Tools配置
- BIM模型文件下载——某加油站服务区Revit模型
- on事件和addevent事件的区别
- 百度短网址开始收费了,这是真的吗?
- 24种可视化图表优缺点