[英]How to use boost normal distribution classes?
我正在尝试使用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%)。
1 :来自boost 文档 :
normal_distribution(RealType mean = 0, RealType sd = 1);
构造均值均值和标准差sd的正态分布。
你没做错什么 对于正态分布,sigma指定标准偏差,而不是范围。 如果生成足够的样本,您将看到只有68%的样本在[均值-sigma,均值+ sigma]范围内,在2 sigma范围内约95%,在3 sigma范围内超过99%。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.