C ++如何设置`std :: exponential_distribution`对象的参数?

时间:2015-10-26 15:56:03

标签: c++ c++11 random exponential-distribution

C ++标准库 - 随机数生成和分布:如何设置指数分布的参数?

我有一个程序需要指数分布的随机数。我正在使用C ++ 11随机数和分发库支持。

我有一个发布:std::exponential_distribution<double> exp_dis(lambda);

lambda是任何值。 0.01.0是值得使用的值。

我使用指针在线程函数中引用此分布。 (我为每个线程函数都有一个独立的分布,以避免数据竞争条件。)

lambda的值在循环内计算,并且每次循环执行时都可以更改。

因此,我想知道参数lamda的值如何在指数分布中“设置”。

从一些快速搜索中,我认为我应该可以使用成员函数param()来做到这一点,但我无法弄清楚要使用的确切语法。

这不起作用:

// Pointer to exponential distribution object
exp_dis_p->param(lambda);

2 个答案:

答案 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功能只是:

  

检查实体的声明类型或查询表达式的类型和值类别。