【问题标题】:C++ How can I set the parameter of a `std::exponential_distribution` object?C++ 如何设置 `std::exponential_distribution` 对象的参数?
【发布时间】:2016-01-25 19:30:44
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您还可以为您的指数分布更改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&lt;double&gt;::param_type

    【讨论】:

      【解决方案2】:

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

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

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

      我在document about the C++ standardizing 中发现了这一点:

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

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

      decltype 函数简单:

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

      【讨论】:

      • @user3728501 对于任何分发类型,嵌套的param_type 类型保证可以使用与父类型相同的构造函数参数构造。
      猜你喜欢
      • 2016-01-25
      • 2017-08-28
      • 1970-01-01
      • 2020-01-07
      • 1970-01-01
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      • 2021-01-14
      相关资源
      最近更新 更多