【发布时间】:2018-09-21 14:02:09
【问题描述】:
我寻找过类似的问题,但没有找到。我想生成正态分布的随机数。我曾经编写过 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 */}
}
所以如果在 main 中,我想创建一个模拟对象
sim A(binded, 100);
它抱怨。 我尝试声明
sim::sim(std::default_random_engine &rng, int number_of_sims){}
但它在抱怨。我应该使用什么类型将“绑定”分布传递给构造函数?还是我完全不正确地解决这个问题。我应该只在全球范围内声明 RNG 引擎吗?我不想那样做。
抱歉,如果这是非常基本的!
【问题讨论】:
-
您的代码与 C++11 不兼容。在 C++14 中引入了自动函数返回类型推导。此外,您的任务过于复杂。您需要的只是将一些可调用对象传递给您的构造函数,并在需要生成随机数时调用它。因此,您的构造函数的签名可能是例如:
sim(std::function<double()> randomNumberGenerator, int numOfSims)。然后只需创建一个不需要任何参数并返回随机双精度的函数(它甚至可能是一些简单的 3 行 lambda)。