我正在尝试使用 boost::normal_distribution 来生成均值 0 和 sigma 1 的正态分布。

以下代码不起作用,因为某些值超过或超出 -1 和 1(也不应该如此)。有人可以指出我做错了什么吗?

#include <boost/random.hpp>
#include <boost/random/normal_distribution.hpp>

int main()
{
  boost::mt19937 rng; // I don't seed it on purpouse (it's not relevant)

  boost::normal_distribution<> nd(0.0, 1.0);

  boost::variate_generator<boost::mt19937&, 
                           boost::normal_distribution<> > var_nor(rng, nd);

  int i = 0; for (; i < 10; ++i)
  {
    double d = var_nor();
    std::cout << d << std::endl;
  }
}

我机器上的结果是:

0.213436
-0.49558
1.57538
-1.0592
1.83927
1.88577
0.604675
-0.365983
-0.578264
-0.634376

正如您所看到的,所有值都不在 -1 和 1 之间。

谢谢大家!

编辑:当你有最后期限并且避免在实践之前学习理论时,就会发生这种情况。

有帮助吗?

解决方案

以下代码不起作用,因为某些值超过或超出 -1 和 1(也不应该如此)。有人可以指出我做错了什么吗?

不,这是对标准差的误解(构造函数中的第二个参数1) 的正态分布。

正态分布就是我们熟悉的钟形曲线。该曲线有效地告诉您值的分布。靠近钟形曲线峰值位置的值比远离钟形曲线峰值(分布尾部)的值更有可能出现。

标准差告诉您值的分布情况。数字越小,值越集中在平均值附近。数字越大,平均值附近的值越不集中。在下图中,您可以看到红色曲线的方差(方差是标准差的平方)为 0.2。将此与具有相同均值但方差为 1.0 的绿色曲线进行比较。您可以看到绿色曲线中的值相对于红色曲线更加分散。紫色曲线的方差为 5.0,并且值更加分散。

因此,这解释了为什么这些值不限于 [-1, 1]. 。然而,一个有趣的事实是,68% 的值始终在平均值的一个标准差之内。因此,作为对您自己的一项有趣测试,编写一个程序,从均值为 0、方差为 1 的正态分布中抽取大量值,并计算均值在一个标准差内的数量。您应该得到接近 68% 的数字(更精确一点是 68.2689492137%)。

alt text

1:来自助推 文档:

normal_distribution(RealType mean = 0, RealType sd = 1);

构造具有平均值和标准差 sd 的正态分布。

其他提示

你没有做错什么。对于正态分布,西格玛指定标准 偏差,不在此范围。如果你产生足够的样本,你会看到只有约 他们中的68%位于范围[均值 - 西格马,平均值±西格玛],约95内2西格玛% 和3-Σ内的多于99%。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top