【问题标题】:How can I create a normal integer distribution in C++11?如何在 C++11 中创建正态整数分布?
【发布时间】:2014-02-25 13:44:13
【问题描述】:

正态分布: std::normal_distribution<T> 只接受floatdouble等实值类型,为什么不接受整数类型?

如何创建正态整数分布?

【问题讨论】:

  • 反问:如果您可以轻松地将 doublefloat 值转换为 int,为什么会有人需要离散分布?
  • 正态分布根据定义是连续的。存在近似正态分布的离散分布。
  • 我猜他们没有! :)
  • @JosephMansfield,是的,它被称为二项分布。
  • 为什么这个问题被搁置对我来说毫无意义。如果您想要一个基于意见的问题,请参阅这个stackoverflow.com/questions/605845/…。这个问题(尤其是答案)相当于(我应该使用 VI 代替 Emacs),但问题和答案大约有 500 票。

标签: c++ c++11 random


【解决方案1】:

我对 C++11 几乎一无所知,但我知道一些数学知识(或者我曾经做过),离散正态分布称为 Binomial distribution。事实上,正态分布就是让n 趋于无穷大时的二项分布。

所以假设 C++11 有一个二项分布,那么你就有一个离散的正态分布。 你为什么不试试std::binomial_distribution

您可能还想阅读de Moivre–Laplace theorem

【讨论】:

  • 你完全正确:在标准库中有一个名为 std::binomial_distribution 的类。
  • 它仅在 p = 1/2 时是对称的,尽管当 n 足够大时,您可以使用其他 p 值。
  • @pjs,是的,这就是为什么 de Moivre-Laplace 定理是中心极限定理的一个特例。
【解决方案2】:

只需将生成的随机值转换为整数即可。

std::normal_distribution<float> noise(0, 2.f);
randomValue = (int) round(noise(engine));

【讨论】:

  • 我很确定您需要四舍五入以保留分布。
  • 是的,否则预期值会被转移。
猜你喜欢
  • 1970-01-01
  • 2016-09-13
  • 2018-12-10
  • 2020-06-25
  • 2021-10-31
  • 1970-01-01
  • 2013-11-16
  • 2023-03-07
  • 2021-04-16
相关资源
最近更新 更多