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

时间:2018-09-21 14:02:09

标签: c++ c++11 random

我一直在寻找类似的问题,但没有找到。我想生成正态分布的随机数。我曾经用C和一些C ++ 98编写代码,但现在尝试回去学习C ++ 11。

我有一个函数返回种子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中调用“ binded()”,它会生成数字

我想要一个需要创建随机数的模拟对象。我的问题与如何传递下面的“ RNG_PART”有关。

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

因此,如果主要,那么我想创建一个模拟对象

sim A(binded, 100);

它抱怨。 我试图宣布

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

但它在抱怨。我应该使用哪种类型将“绑定”分发传递给构造函数?还是我完全不正确地进行此操作。我应该只在全球范围内声明RNG引擎吗?我不想这样做。

很抱歉,这很基本!

1 个答案:

答案 0 :(得分:1)

sim的参数类型与绑定的类型不匹配。创建绑定时,可以通过使用auto而不是声明类型来避免此问题,但是稍后将需要它。在sim类中进行以下操作,而不是尝试提前确定类型。这也使您可以更改RNG或随机分布,而无需更改sim类:

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

请注意,模板定义对于使用它的位置必须是可见的,因此除非将其使用的唯一代码在该文件中,否则您不能将其放入cpp文件中。通常,模板定义与声明的位置在同一h文件中。

然后,您将创建SIM卡为:

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

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

由于绑定可以根据所选的随机数分布返回不同的类型,因此可以使用以下方法在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中将被删除