如何在C ++中设置统一分布的参数?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在C ++中设置统一分布的参数?相关的知识,希望对你有一定的参考价值。
有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;
}
我们可以看到,我创建了一个新对象来更改参数。是否有更便宜的方式(打字次数或更少的运行时间)?
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。这听起来很复杂,而且确实如此。
param_type
以上是关于如何在C ++中设置统一分布的参数?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 laravel 的 javascript 代码中设置路由名称
如何在 Visual Studio 中设置让 C++/C 代码只在一个线程中运行以测试运行时间?