【问题标题】:Own implementation of Random Number Distribution for C++11自己的 C++11 随机数分布实现
【发布时间】:2014-07-07 08:29:15
【问题描述】:

我需要在 C++11 中实现我自己的随机数分布类,但我找不到一个简单的实现来让我开始。

我已经搜索了gcc源码,但是只找到了头文件,没有找到不同非均匀分布的实现。

您能否指出一个简单但完整的 C++11 中非均匀分布类的示例或在此处发布?

【问题讨论】:

  • 随机数库是header-only,libstdc++提供的headers包含你想知道的一切。
  • 在头文件中,我总是在不同的分发类中看到两个重载的 () 运算符。第一个调用第二个,但第二个似乎没有实现。
  • 医生开了更多的咖啡,more perseverance 和健康剂量的grep:都在bits/random.tcc
  • 我想实现你自己的发行版没什么太奇特的,所以我假设其他人也可以从 simple 示例中受益,该示例可读且不会以奇怪的方式分布在不同的文件中结局。我以前从未研究过 gcc 源代码。
  • 原理很简单inverse transform sampling,但是你必须注意要有正确的均匀输入分布(这是微妙的)。我想这不是任何不愿意花至少一个下午时间认真研究该主题的人应该做的事情,因为破坏的随机分布比没有更糟糕。

标签: c++ c++11 random distribution


【解决方案1】:

我想实现你自己的发行版没什么太奇特的......

你猜错了。 Luc Devroye 就该主题写了800 page book。没有一种技术适用于所有发行版。有 4 种通用方法:

  1. 反演 - 如果累积分布函数 FX(b),-∞ X (X),应用于其自身随机变量的 CDF,具有均匀 (0,1) 分布。等于 FX(X)=U 并求解 X(如果可能)。

  2. 卷积 - 对随机变量求和或求差会产生新的分布。例如,两个制服的总和具有三角形分布;或者,n 个独立卡方 (1) 的总和产生卡方 (n)

  3. 组合 - 可以使用条件概率从更简单的分布分段构建一些复杂分布。

  4. 技巧/特殊关系 - 利用不同分布之间的独特关系,例如标准正态的平方是卡方 (1) 随机变量这一事实;或者卡方(2)与指数(2)相同。与毕达哥拉斯的 thm 一起,这两个事实是用于生成法线的 Box-Muller 方法的核心。将两个独立的标准法线绘制在一起,你会得到一个从 (0,0) 出发的二维向量,该向量朝向一致的 (0,2π) 方向,长度为sqrt(exponential(2))。生成这样一个向量并使用正弦和余弦变换将其转换回笛卡尔坐标,以产生两个独立的法线。

Devroye 的书详细介绍了许多“流行”发行版,但由于发行版的数量是无限的,因此不可能进行详尽的处理。

tutorial paper 第 59 页的第 4.3 节为上面概述的四种技术中的每一种提供了一个工作示例,并在第 60-62 页上提供了反转证明。

【讨论】:

  • +1 和更多信息:该标准同时提供了piecewise_constant_distributionpiecewise_linear_distribution,它们可以很容易地用于近似任意分布。如果这样的近似值是可以接受的,并且如果您知道所需的概率分布,那么这些是易于使用的可行替代方案。
  • P.S:很好的教程纸!
  • @HowardHinnant 谢谢,我发现很难在严格正确和可访问之间走钢丝。
猜你喜欢
  • 1970-01-01
  • 2013-04-07
  • 2020-09-02
  • 2012-05-08
  • 1970-01-01
  • 2012-12-10
  • 2013-04-07
  • 2014-12-19
  • 2014-01-16
相关资源
最近更新 更多