如何在C++中设置均匀分布的参数?

How to set parameters of a uniform distribution in C++?

本文关键字:分布 参数 设置 C++      更新时间:2023-10-16

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

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

如我们所见,我创建了一个新对象来更改参数。有没有更便宜的方法(键入次数或更少的运行时间)来做到这一点?

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将调用传递参数的构造器。因此,在每个循环中,通过使用已执行的 c'tor,直接使用您想要的参数创建uniform_int_distribution,而不是编造一个虚假实例来稍后重置参数。


为了完整起见:如果你真的想走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_typec'tor 保证镜像其发行版 c'tor,所以它只是引入了一个临时调用不同的 c'tor,旨在以相同的方式工作。这听起来很复杂,确实如此。

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