代码之家  ›  专栏  ›  技术社区  ›  TCD

将C++随机数分布传递到函数

  •  0
  • TCD  · 技术社区  · 6 年前

    我有一个函数返回一个种子RNG

    auto seeded_rng () {
          ....  //do seeding.
         std::default_random_engine Eng(/*seeds*/);
         return Eng;
    }
    

    在我的主函数中,我将RNG绑定为高斯分布

    auto binded = std::bind(std::normal_distribution<double>{0,1.0},seeded_rng);
    

    这个函数可以正常工作。我可以直接在main中调用“bined()”,它会生成数字

    class sim
    {
    public:
           sim( RNG_PART & rng, int_number_of sims ){ /* Do whatever */}
    }
    

    如果在main中,我想创建一个模拟对象

    sim A(binded, 100);
    

    我试着宣布

    sim::sim(std::default_random_engine &rng, int number_of_sims){}
    

    但它在抱怨。我应该使用什么类型将“绑定”分发传递给构造函数?或者说我做得完全不对。我应该在全球范围内申报RNG引擎吗?我不想那样做。

    抱歉,如果这是非常基本的!

    1 回复  |  直到 6 年前
        1
  •  1
  •   Yakk - Adam Nevraumont    6 年前

    sim的参数类型与bined的类型不匹配。创建绑定时,可以使用 auto 而不是声明类型,但稍后您将需要它。不如在课堂上用下面的sim,而不是试图提前搞清楚类型。这也允许您在不更改sim卡类别的情况下更改RNG或随机分布:

    template<typename T>
    class sim
    {    
    public:
        sim(T& rng, int_number_of sims ){ /* Do whatever */}
    

    sim<decltype(binded)> A(binded,100);
    

    decltype(binded) 是一种告诉sim函数模板绑定的类型的方法。

    using rnd_return_type = typename std::result_of<T()>::type; //in C++11, C++14
    

    using rnd_return_type = std::invoke_result_t<T>; //C++17 and later
    

    std::result_of 在C++ 17中被弃用,将在C++ 20中被删除。