C++标准库-随机数生成和分布:如何设置指数分布的参数?
我有一个需要指数分布随机数的程序。我正在使用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);发布于 2015-10-27 12:29:13
您还可以更改指数分布的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;
}或者,如果您只处理double类型,那么您也可以执行以下操作。
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。
发布于 2015-10-27 00:03:15
通过以下设置,您应该能够设置新的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的功能很简单:
检查实体的声明类型或查询表达式的类型和值类别。
https://stackoverflow.com/questions/33350164
复制相似问题