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分段常数分布随机数用法详解...相关推荐

  1. html语言中注释标记,html注释代码<!--......--> 标签的用法详解

    别小看了简单的html注释代码标签,它的作用还是挺大的,对于复杂而庞大的代码量,有必要在需要说明,备注,解释的地方插入一些注释内容,方便以后编辑.修改.查询代码,还可以对某些不需要显示或执行的代码进行 ...

  2. c语言随机变量seed,如何产生随机数?C语言rand()和srand()用法详解

    在实际编程中,我们经常需要生成随机数.因此rand()与srand()出现了,本文详解随机数相关内容 一.rand()函数相关 函数头文件:stdlib.h 函数定义:int rand(void) 函 ...

  3. 784-C语言rand和srand用法详解

    C语言rand和srand用法详解 在实际编程中,我们经常需要生成随机数,例如,贪吃蛇游戏中在随机的位置出现食物,扑克牌游戏中随机发牌. 在C语言中,我们一般使用 <stdlib.h> 头 ...

  4. sizeof 在C语言的作用,C语言中的sizeof的用法详解

    C语言中的sizeof的用法详解 一.sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等.它并不是函数.sizeof操作符以字节形式给出了其操作数的存储大小.操 ...

  5. c语言struct的作用和用法,c语言struct用法详解

    c语言struct用法详解 在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据.结构体的定义形式为:struct 结构体名{ 结构体所包含的变量或数组 }; 结构体是一种集合,它里面包 ...

  6. c语言while将字符循环,C语言 while语句的用法详解

    在C语言中,共有三大常用的程序结构: 顺序结构:代码从前往后执行,没有任何"拐弯抹角": 选择结构:也叫分支结构,重点要掌握 if else.switch 以及条件运算符: 循环结 ...

  7. R语言使用survminer包生存分析及可视化(ggsurvplot)实战详解:从数据集导入、生存对象生成、ggsurvplot可视化参数配置、设置、可视化对比

    R语言使用survminer包生存分析及可视化(ggsurvplot)实战详解:从数据集导入.生存对象生成.ggsurvplot可视化参数配置.设置.可视化对比 目录 R语言使用survminer包生 ...

  8. php函数find的用法,c语言find函数的用法详解

    c语言find函数的用法详解 C语言之find()函数 find函数用于查找数组中的某一个指定元素的位置. 比如:有一个数组[0, 0, 5, 4, 4]: 问:元素5的在什么位置,find函数 返回 ...

  9. c语言常量的正确表示const,C语言中的const和free用法详解

    注意:C语言中的const和C++中的const是有区别的,而且在使用VS编译测试的时候.如果是C的话,请一定要建立一个后缀为C的文件,不要是CPP的文件.因为,两个编译器会有差别的. 一.C语言中的 ...

最新文章

  1. 图像有损压缩matlab程序,基于Matlab的灰度图像DCT与RLE的混合有损压缩
  2. L1正则化为什么又叫做稀疏因子?
  3. 变步长龙格库塔法matlab代码,matlab 龙格库塔法 变步长龙格库塔法.doc
  4. c语言常用数据类型所占用的字节数
  5. AI理论知识基础(19)-线性变换(1)
  6. gin 生成api文档_gin-swagger 生成RESTful风格OpenAPI文档
  7. 用jQuery实现一些导航条切换,显示隐藏
  8. linux shell学习笔记(二) 变量和运算符
  9. return 输出为空php,thinkphp5 返回json数据的方法---以及返回json为空的原因
  10. 漫谈 - 从技术业务骨干走向管理
  11. 【重点】LeetCode 146. LRU Cache
  12. vba 添加outlook 签名_在Excel 2013中使用vba插入电子邮件签名
  13. 安装cude11.2.exe报错:Could not create file “C: )Users\xxx\ AppData \Local\ Temp \CUDA\GFExperience
  14. SharepointDesigner创建一个工作流
  15. DNS?本地填写的DNS有什么用?DNS怎么工作的?
  16. GameFramework篇:AssetsBundle Tools配置
  17. BIM模型文件下载——某加油站服务区Revit模型
  18. on事件和addevent事件的区别
  19. 百度短网址开始收费了,这是真的吗?
  20. 24种可视化图表优缺点

热门文章

  1. java 跟软帝-攀哥学做编程 飞机大战4
  2. Vue 图书管理案例
  3. K8s初探入门详细教程(一)
  4. java入门之contine和break的区别
  5. DCMM数据管理师(CDP)认证考试与培训
  6. PCB设计表面到底应不应该敷铜?
  7. AcWing 841. 字符串哈希
  8. PKU 2446 Chessboard
  9. 【青少年编程技术等级测评】图形化编程 Python编程等级讲解
  10. 看守所视频AI行为分析算法