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

问题描述 投票:0回答:2

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;
}

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

c++ c++11 stl
2个回答
0
投票

param_type实例不应修改。该类型没有提供api。我不认为它有确切的类型,即它的实现定义。所以没有合法的方法来设置params,其他用所需的方法实例化或者获取另一个分发的参数集的副本。

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

#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'tor,而不是组成一个伪造的实例来重置params。


为了完整起见:如果你真的想要使用qazxsw poi方式,你可以跳过分发副本并构建一个临时的:

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; } c'tor保证能够反映它的分布c'tor,所以它只是引入了一个临时的来调用另一个被设计为以相同方式工作的c'tor。这听起来很复杂,而且确实如此。


0
投票
param_type
© www.soinside.com 2019 - 2024. All rights reserved.