【问题标题】:Sampling from a discrete probability distribution in C++从 C++ 中的离散概率分布中采样
【发布时间】:2012-04-14 15:34:30
【问题描述】:

我是 C++ 新手,对缺乏可访问的通用概率操作工具(即 Boost 和标准库中缺乏东西)感到非常惊讶。我用其他语言完成了很多科学编程,但标准和/或无处不在的第三方插件总是包含全套概率工具。一位朋友称 Boost 是 C++ 的等效无处不在的插件,但当我阅读 Boost 文档时,它似乎缺乏我认为非常基本的内置插件。

我找不到采用某种离散概率数组并生成根据这些概率选择的索引的内置函数。我当然可以为此编写自己的函数,但我只是想检查我是否缺少执行此操作的标准方法。

我觉得必须在如此低的级别编写自己的函数是一件坏事,但我正在为一个全部使用 C++ 的大型项目编写一个新的模拟模块。我通常的首选策略是用 Python 编写它并将 Python 链接到 C++,但是因为一旦我完成它,其他几个人将不得不管理这段代码,而且他们都不知道 Python,我认为它会更谨慎地使用 C++ 将其交付给他们。

更一般地说,人们在 C++ 中对诸如从标准分布进行抽样之类的事情做了什么,特别是像多元正态分布这样基本的事情?

【问题讨论】:

  • 也总是有gnu.org/software/gsl/manual/html_node/…。而且从直方图中采样真的很简单,如果你不想要更大的包,就自己写这 10 行。
  • @honk 我很欣赏这个链接。但是,我遇到了太多试图编写自己的基本统计函数的科学项目。我认为这会让事情变得更糟。是的,绘制制服并将其与概率的累积总和进行比较很容易,但我认为大多数项目从那里开始是个坏主意,就像我很少相信选择实施自己的 Cholesky 分解的人的科学代码一样而不是使用 LAPACK 或他们自己的线性求解器。

标签: c++ boost probability sampling


【解决方案1】:

您应该减少对 C++ 的抨击,多提出问题 - 我们会尽力帮助并尊重 SO。像您这样的问题经常被标记为煽动性的。

Boost::math 似乎提供了您正在寻找的东西:https://www.quantnet.com/cplusplus-statistical-distributions-boost/ - 不过,我不能 100% 确定它处理多变量分布的能力(我也不是统计专家)。

在这里获取:http://www.boost.org/doc/libs/1_49_0/libs/math/doc/html/index.html

【讨论】:

  • 这不是预期的 bash。我喜欢 C++,因为我正在学习它,并且我看到了混合低级内存控制和面向对象的好处。我只是指出我的惊讶,这更多是我的无知造成的。
【解决方案2】:

(从评论中移出。)

你看过Boost.Math.StatisticalDistributions吗?具体来说,它的Discrete Probability Distributions?

Boost 不是库,它是库的集合,因此有时很难准确找到您要查找的内容 - 但这并不意味着它不存在。 ;-]

【讨论】:

【解决方案3】:

如前所述,您需要查看boost/math/distributions 和朋友以满足您的需求。

这里是a very good, detailed tutorial on getting these working for you in Boost. 你可能还想把重心放在stan 后面,这在这个领域看起来很有前途。

【讨论】:

    【解决方案4】:

    也许我误解了你的意图,但在我看来你想要的只是std::discrete_distribution

    【讨论】:

    • 是的,这似乎是解决问题的最流畅的方法。 30 多分钟的谷歌搜索诸如“C++ 标准离散分布样本”之类的东西是如何没有遇到这个问题的?哦,好吧,我还是不会尝试 Bing :)
    • 是的,在 C++ 中有时会这样,很有趣。我曾经花了几个小时(或者感觉像几个小时)搜索std::array!我知道存在这样一个类,但我没想到它会有最明显的名称。
    【解决方案5】:

    Boost 的数学库非常适合处理不同的发行版,但如果您只对采样感兴趣(如您在帖子中提到的问题),那么查看 boost Random 库可能更适合您任务。例如,This link 展示了如何模拟滚动加权骰子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-04
      • 2011-09-02
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多