如何在C ++中设置统一分布的参数?

时间:2018-01-02 01:09:21

标签: c++ c++11 stl

整数类型有k个不同的均匀分布。范围不一定相同,比如dist1~U(0,10), dist2~U(0,5), etc.我在C ++ 14中使用uniform_int_distribution class。这是我的代码:

#include <vector>
#include <random>

using namespace std;

int main() {
  vector<int> distRange = {4,5,2,4};
  vector< uniform_int_distribution<int> > U(distRange.size(),uniform_int_distribution<int>(0,1));

  for (int i=0; i<distRange.size(); i++)
    U[i].param( uniform_int_distribution<int>(0,distRange[i]).param() );

  return 0;
}

正如我们所看到的,我创建了一个新对象来更改参数。是否有更便宜的方式(打字次数或更少的运行时间)?

2 个答案:

答案 0 :(得分:0)

param_type个实例无意修改。该类型没有提供api。我认为它没有确切的类型,即它的实现定义。因此没有合法的方法来设置参数,其他用实际的方法对其进行实例化或者获取另一个分布的参数集的副本。

但您可以使用所需参数在矢量中创建分布:

#include <vector>
#include <random>

using namespace std;

int main() {
  vector<int> distRange = {4,5,2,4};
  vector< uniform_int_distribution<int> > U;

  for(auto&& max : distRange) {
    U.emplace_back(0, max);
  }
  return 0;
}

Emplace将调用constu传递params。因此,在每个循环中,uniform_int_distribution直接使用您想要的参数创建,使用专用的c,而不是构成伪造的实例以便稍后重置参数。

为了完整性:如果你真的想以param_type方式前进,你可以跳过分发副本并构建一个临时副本:

#include <vector>
#include <random>

using namespace std;

int main() {
  vector<int> distRange = {4,5,2,4};
  vector< uniform_int_distribution<int> > U(distRange.size());

  for (int i=0; i<distRange.size(); i++)
    U[i].param(uniform_int_distribution<int>::param_type(0,distRange[i]));

  return 0;
}

这似乎是多余的,因为param_type c保证能够反映其发行版本,所以它只是引入一个临时的来调用另一个设计为同样工作方式的c&tor; 。这听起来很复杂,而且确实如此。

答案 1 :(得分:0)

#include <vector>
#include <random>
using namespace std;

auto main()
    -> int
{
    using Distr = uniform_int_distribution<int>;

    vector<Distr> u;
    for( int const b : {4,5,2,4} )
    {
        u.emplace_back( 0, b );
    }
}