如何设置“discrete_distribution”c ++的向量

时间:2017-12-28 20:13:05

标签: c++ vector random

我正在尝试模拟像马尔可夫链这样的东西 并使用discrete_distribution模拟状态s_i到s_j的变化。 但是,当然,这是一个矩阵,而不是矢量。 所以我试试。

std::vector <uint16_t> v {{...},
                          {...},
                           ...
                          {...},};

std::vector <std::discrete_distribution <uint16_t> > distr(n, std::distribution <uint16_t> (v.begin(), v.end()) );

但这不起作用。

注意:如果我只尝试1个向量,这是uint16_t的向量

// CHANGE v by v[0]
std::vector<std::discrete_distribution <uint64_t>> distr(1, std::discrete_distribution <uint64_t> (vecs[0].begin(), vecs[0].end()));

基于此answer

我知道

std::vector <std::discrete_distribution <uint16_t> > distr(n, std::distribution <uint16_t> (v.begin(), v.end()) );

不正确,但我说的是将v1更改为v。以证明可以使用离散分布的向量

2 个答案:

答案 0 :(得分:5)

您可以使用列表初始化来初始化嵌套向量。 E.g:

std::vector<std::vector<int>> v{
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

答案 1 :(得分:2)

我找到了一种方法,就像在answer

中一样

使用此模板

template<typename T>
void set_distributions(std::vector< std::discrete_distribution <T> > &distr,  const std::vector< std::vector<T> > &vecs){
  for (uint64_t i = 0; i < vecs.size(); ++i) {
    distr.push_back( std::discrete_distribution <uint64_t> (vecs[i].begin(), vecs[i].end()) );
  }

}

并且使用此功能,当您清空分配矢量时

std::vector<std::discrete_distribution <uint64_t>> distr;
  set_distributions(distr, vecs);