代码之家  ›  专栏  ›  技术社区  ›  David

如何使用Boost正态分布类?

  •  24
  • David  · 技术社区  · 15 年前

    我尝试使用boost::normal_分布来生成平均值为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之间。

    提前谢谢大家!

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

    2 回复  |  直到 9 年前
        1
  •  30
  •   Community CDub    8 年前
    < Buff行情>

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

    < /块引用>

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

    正态分布是常见的钟形曲线。这条曲线有效地告诉你值的分布。接近钟形曲线峰值的值比远离的值(分布的尾部)更可能出现。

    标准偏差告诉您值是如何分布的。数值越小,平均值周围的值越集中。数值越大,平均值周围的集中值越小。在下图中,您可以看到红色曲线的方差(方差是标准差的平方)为0.2。将其与平均值相同但方差为1.0的绿色曲线进行比较。可以看到,相对于红色曲线,绿色曲线中的值分布得更广。紫色曲线的方差为5.0,数值分布更广。

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

    1 :From the Boost documentation. :

    < Buff行情>

    正态分布(realtype mean=0,realtype sd=1);

    用平均值和标准差sd构造正态分布。

    < /块引用> 做错了吗?

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

    正态分布是常见的钟形曲线。这条曲线有效地告诉你值的分布。接近钟形曲线峰值的值比远离的值(分布的尾部)更可能出现。

    标准偏差告诉您值是如何分布的。数值越小,平均值周围的值越集中。数值越大,平均值周围的集中值越小。在下图中,您可以看到红色曲线的方差(方差是标准差的平方)为0.2。将其与平均值相同但方差为1.0的绿色曲线进行比较。可以看到,相对于红色曲线,绿色曲线中的值分布得更广。紫色曲线的方差为5.0,数值分布更广。

    所以,这就解释了为什么价值观不局限于 [-1, 1] .然而,一个有趣的事实是,68%的值总是在平均值的一个标准偏差内。因此,对于你自己来说,作为一个有趣的测试,编写一个程序,从平均值为0和方差为1的正态分布中提取大量的值,并计算在平均值的一个标准偏差内的数字。你应该得到一个接近68%的数字(68.2689492137%更精确一点)。

    alt text

    :从增压 documentation :

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

    用平均值和标准差sd构造正态分布。

        2
  •  8
  •   Jim Lewis    15 年前

    你没有做错什么。对于正态分布,sigma指定标准 偏差,不是范围。如果你产生足够的样本,你只会看到 其中68%在范围内[平均-西格玛,平均+西格玛],大约95%在2西格玛范围内, 在3西格玛范围内超过99%。