2

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);
4

2 回答 2

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_typefor distribution 可以声明为std::exponential_distribution<double>::param_type.

于 2015-10-27T04:29:12.940 回答
0

使用以下内容,您应该能够设置新的 lambda:

decltype(exp_dis_p->param()) new_lambda (lambda);
exp_dis_p->param(new_lambda);

这是我一段时间以来一直在使用的代码。就像 Praetorian 在评论中解释的那样, param() 类型具有与父类型相同的参数。

我在有关 C++ 标准化的文档中发现了这一点:

对于 D 的每个构造函数,其参数对应于分布的参数,P 应具有相应的构造函数,其要求相同,参数数量、类型和默认值相同。此外,对于 D 的每个返回与分布参数对应的值的成员函数,P 应具有相应的名称、类型和语义相同的成员函数。

其中 D 是分布类,P 是由 D 关联的 param_type 命名的类型。

decltype函数很简单:

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

于 2015-10-26T16:03:14.650 回答