C++ 有效提高分发使用率

C++ 有效提高分发使用率,c++,boost,distribution,C++,Boost,Distribution,重新措辞这个问题 我正在为boost normal distribution创建一个包装器类,并希望使其尽可能高效 如果我使用: double x = 0.0; boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > var_nor(rng, nd); for (int i=0; i<20; i++) { double x = var_nor(); } 但在这

重新措辞这个问题

我正在为boost normal distribution创建一个包装器类,并希望使其尽可能高效

如果我使用:

double x = 0.0;
boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > var_nor(rng, nd);
for (int i=0; i<20; i++) {
     double x = var_nor();
}
但在这种情况下,我得到一个错误,说var_或ie。没有参数是找不到的。 有谁能告诉我这些升压声明是怎么回事吗

boost:变量_生成等

行实际上与var_nor一致吗? 用我有限的C++知识,ValuNOR看起来是用两个不同的签名定义的。 谢谢各位 Pete

在代码中,var_nor是一个变量,不是一个函数,因此它没有签名。它表示一个variate_生成器对象,该对象的行为类似于函数,因为它支持运算符

在代码中,您可以同时声明和初始化var_nor。rng和nd参数被传递给variate_生成器对象的构造函数

当您将声明移动到类的构造函数中时,您正在将var_nor声明为构造函数中的局部变量,因此它在其他地方不可用也就不足为奇了。要使某些内容在整个类中都可用,它必须是一个成员变量。在类中声明它为private:

class NormalDistribution
{
  boost::random::mt19937 _rng;
  boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > var_nor;
public:
  NormalDistribution();
};
然后在构造函数中初始化它:

boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > var_nor(rng, nd);
NormalDistribution::NormalDistribution():
  _rng(), var_nor(_rng, boost::normal_distribution<>(0.0, 1.0))
{ }
需要首先声明_rng成员,以便首先初始化它。nd参数可以省略,并替换为直接传递给var\u nor构造函数的临时正态分布对象,如上所示

通过这些更改,您应该能够在对示例函数的多次调用中使用同一个正态分布对象,或者对正态分布类的任何其他用途

在您从问题中删除的代码中,您混淆了变量声明和函数声明。您将nd声明为接收两个参数并返回正态分布的函数。var_nor也是如此。当你真的想要一个对象时,它是一个函数。您感到困惑,因为它恰好是一个作用类似于函数的对象,但它仍然只是一个对象。

在您的代码中,var\u nor是一个变量,不是函数,因此它没有签名。它表示一个variate_生成器对象,该对象的行为类似于函数,因为它支持运算符

在代码中,您可以同时声明和初始化var_nor。rng和nd参数被传递给variate_生成器对象的构造函数

当您将声明移动到类的构造函数中时,您正在将var_nor声明为构造函数中的局部变量,因此它在其他地方不可用也就不足为奇了。要使某些内容在整个类中都可用,它必须是一个成员变量。在类中声明它为private:

class NormalDistribution
{
  boost::random::mt19937 _rng;
  boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > var_nor;
public:
  NormalDistribution();
};
然后在构造函数中初始化它:

boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > var_nor(rng, nd);
NormalDistribution::NormalDistribution():
  _rng(), var_nor(_rng, boost::normal_distribution<>(0.0, 1.0))
{ }
需要首先声明_rng成员,以便首先初始化它。nd参数可以省略,并替换为直接传递给var\u nor构造函数的临时正态分布对象,如上所示

通过这些更改,您应该能够在对示例函数的多次调用中使用同一个正态分布对象,或者对正态分布类的任何其他用途


在您从问题中删除的代码中,您混淆了变量声明和函数声明。您将nd声明为接收两个参数并返回正态分布的函数。var_nor也是如此。当你真的想要一个对象时,它是一个函数。您感到困惑,因为它恰好是一个作用类似于函数的对象,但它仍然只是一个对象。

好的,使用Rob Kennedy的答案编写最终版本,供其他可能感兴趣的人使用:

// normaldistribution.h
#ifndef NORMALDISTRIBUTION_H
#define NORMALDISTRIBUTION_H

#include <boost/random.hpp>
#include <boost/random/normal_distribution.hpp>
class NormalDistribution
{
 public:
    NormalDistribution();
    double sample(void);
 private:
    // Use the boost random number generator
    boost::mt19937 rng;
    // Make a variate_generator OBJECT.
    boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > var_nor;
};

#endif // NORMALDISTRIBUTION_H

// normaldistribution.cpp
NormalDistribution::NormalDistribution():
  rng(), var_nor(rng, boost::normal_distribution<>(0.0, 1.0))
{
    std::cout << "Called normal distribution constructor, passing up var_nor" << std::endl;
}

double NormalDistribution::sample(void) {
    double x = var_nor();
    return x;
}

// main.cpp
#include "normaldistribution.h"

int main(int argc, char *argv[])
{
    NormalDistribution *nd = new NormalDistribution();
    for (int i=0; i < 10; ++i)
    {
      double d = nd->sample();
      std::cout << d << std::endl;
    }
    return 0;
}

好的,使用Rob Kennedy的答案编写最终版本,对于其他可能感兴趣的人:

// normaldistribution.h
#ifndef NORMALDISTRIBUTION_H
#define NORMALDISTRIBUTION_H

#include <boost/random.hpp>
#include <boost/random/normal_distribution.hpp>
class NormalDistribution
{
 public:
    NormalDistribution();
    double sample(void);
 private:
    // Use the boost random number generator
    boost::mt19937 rng;
    // Make a variate_generator OBJECT.
    boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > var_nor;
};

#endif // NORMALDISTRIBUTION_H

// normaldistribution.cpp
NormalDistribution::NormalDistribution():
  rng(), var_nor(rng, boost::normal_distribution<>(0.0, 1.0))
{
    std::cout << "Called normal distribution constructor, passing up var_nor" << std::endl;
}

double NormalDistribution::sample(void) {
    double x = var_nor();
    return x;
}

// main.cpp
#include "normaldistribution.h"

int main(int argc, char *argv[])
{
    NormalDistribution *nd = new NormalDistribution();
    for (int i=0; i < 10; ++i)
    {
      double d = nd->sample();
      std::cout << d << std::endl;
    }
    return 0;
}

构造函数很奇怪:它定义了一些完全无用的局部变量,并且无法初始化任何类成员。也许是时候编写一本C++的好的书了?构造函数是奇怪的:它定义了一些完全无用的局部变量,并且不能初始化任何类成员。也许是时候写一本关于C++的好书了?谢谢你,Rob,把它清理一下。我没能认出超载的车。谢谢你,罗布,这就搞定了。我错过了超载的识别。我看不到rng和var_的理由,也看不到公开的理由。我看不到rng和var_的理由,也看不到公开的理由。