我有一个程序需要指数分布的随机数。我正在使用C ++ 11随机数和分发库支持。
我有一个发布:std::exponential_distribution<double> exp_dis(lambda);
lambda
是任何值。 0.0
或1.0
是值得使用的值。
我使用指针在线程函数中引用此分布。 (我为每个线程函数都有一个独立的分布,以避免数据竞争条件。)
lambda
的值在循环内计算,并且每次循环执行时都可以更改。
因此,我想知道参数lamda
的值如何在指数分布中“设置”。
从一些快速搜索中,我认为我应该可以使用成员函数param()
来做到这一点,但我无法弄清楚要使用的确切语法。
这不起作用:
// Pointer to exponential distribution object
exp_dis_p->param(lambda);
答案 0 :(得分:2)
您还可以更改指数分布的lambda
,如下所示。
template<typename T>
void set_new_lambda(std::exponential_distribution<T> *exp_dis, T val)
{
typename std::exponential_distribution<T>::param_type new_lambda(val);
exp_dis->param(new_lambda);
}
可以使用它如下
int main()
{
std::exponential_distribution<double> exp_dis(0.1);
std::cout<<exp_dis.lambda()<<'\n';
set_new_lambda(&exp_dis,0.2);
std::cout<<exp_dis.lambda()<<'\n';
return 0;
}
或者如果你只处理双重类型,那么你也可以这样做。
int main()
{
std::exponential_distribution<double> exp_dis(0.1);
auto ptr = &exp_dis;
std::exponential_distribution<double>::param_type new_lambda(0.2);
ptr->param(new_lambda);
}
您可以看到param_type
分发可以声明为std::exponential_distribution<double>::param_type
。
答案 1 :(得分:0)
使用以下内容,您应该能够设置新的lambda:
decltype(exp_dis_p->param()) new_lambda (lambda);
exp_dis_p->param(new_lambda);
这是我从一段时间以来一直在使用的代码。就像Praetorian在评论中解释的那样,param()类型与父类型具有相同的参数。
我在document about the C++ standardizing中找到了这个:
对于每个D参数的构造函数 参数的分布,P应具有相应的 构造函数受相同要求和参数的约束 数量,类型和默认值相同。而且,对于每一个 返回值对应的D的成员函数 分配参数,P应具有相应的成员 具有相同名称,类型和语义的函数。
D是分布类,P是由D关联的param_type命名的类型。
decltype
功能只是:
检查实体的声明类型或查询表达式的类型和值类别。