首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C++中将离散分布用作类变量

如何在C++中将离散分布用作类变量
EN

Stack Overflow用户
提问于 2020-11-09 17:49:03
回答 1查看 99关注 0票数 0

所以我有一个巨大的程序(几个.cpp文件和.h)是由别人开发的,我正试图在其中一个文件中添加一些功能。我刚接触C++,所以这对我来说很难。

我想在初始化“优化器”时使用初始化幂律分布,然后在调用“迭代”时使用它的样本。我已经设法让它工作了,但只在“初始化”中,我想让它作为一个类变量在整个文件中工作。我想要的最小示例如下,考虑到Optimizer是在"Optimizer.h“中定义的,并不是真正相关的,随机引擎是在"Util.h”中定义的。

头文件如下所示:

代码语言:javascript
复制
#ifndef FASTONEPLUSONE_H_
#define FASTONEPLUSONE_H_

#include "Optimizer.h"
#include "Util.h"
#include <map>

// Inherits and implements the Optimizer interface
class FastOnePlusOne : public Optimizer {
 public:
  FastOnePlusOne(Random& _rand, shared_ptr<Evaluator> _evaluator,
               Configuration& _config);
  virtual bool iterate() override;
  create_optimizer(FastOnePlusOne);

 private:
  // Power law distribution
  std::discrete_distribution<int>power_dist; // THIS IS MADE BY ME
};

#endif /* FASTONEPLUSONE_H_ */

和cpp文件:

代码语言:javascript
复制
FastOnePlusOne::FastOnePlusOne(Random& _rand, shared_ptr<Evaluator> _evaluator,
                           Configuration& _config)
    : Optimizer(_rand, _evaluator, _config) {
  // Power-law distribution
  int length = 10;
  float B = 1.5;
  vector<double> pmf(length);
  std::iota(pmf.begin(), pmf.end(), 1);
  for(size_t i = 0; i < length; i++) {
    pmf[i] = 1.0 / pow(pmf[i], B);
  }
  pmf.insert(pmf.begin(), 0);
  std::discrete_distribution<int> power_dist(pmf.begin(),pmf.end());
  
  std::map<int, int> m;
  for(int n=0; n<10000; ++n) {
    ++m[power_dist(rand)];
  }
  for(auto p : m) {
    std::cout << p.first << " generated " << p.second << " times\n";
  }
}

// Performs an iteration
bool FastOnePlusOne::iterate() {
  // Distributions needed at the current alpha
  int alpha = power_dist(rand);
  std::cout << alpha << " ";
  }
}

这段代码现在在FastOnePlusOne初始化时在变量power_dist中创建了幂律分布,它正确地打印了10000个样本的结果,但alpha始终被采样为0。我怎么才能解决这个问题呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-09 18:11:00

替换此行:

代码语言:javascript
复制
std::discrete_distribution<int> power_dist(pmf.begin(),pmf.end());

有了这个:

代码语言:javascript
复制
power_dist = std::discrete_distribution<int>(pmf.begin(),pmf.end());

解释:

在错误的版本中,您创建了一个名为power_dist的新局部变量,该变量隐藏了类变量this->power_dist,并使用了它。原始this->power_dist从未在FastOnePlusOne::FastOnePlusOne()中使用或正确初始化。在函数FastOnePlusOne::iterate()中,您可以对未初始化的this->power_dist进行采样。

在第二个版本中,您将为类变量power_dist分配一个正确初始化的对象,稍后将在同一函数和iterate()函数中使用该变量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64749259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档