我一直在寻找类似的问题,但没有找到。我想生成正态分布的随机数。我曾经用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引擎吗?我不想这样做。
很抱歉,这很基本!
答案 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中将被删除