std :: generate - 如何使用随机数生成器?

Mar*_*son 3 c++ random boost std ublas

在我的编程中,我需要创建一个用户定义数量的ublas向量.我想这样做

"的std ::生成".但是我遇到编译错误,这使我无法做到.

我使用的代码是这样的:

for (size_t a_= 0; a_ < p_; a_++)
{
    ublas::vector<double> next_vhat(size_of_vec);
    std::generate(next_vhat.begin(), next_vhat.end(), mygen.give_rnd);
    v_hat_.push_back(next_vhat);
}
Run Code Online (Sandbox Code Playgroud)

我不得不std::generate为函数调用创建一个专门的函数,因为class不允许我使用带参数的函数作为第三个参数("gen",参见这里.我需要数字是正态分布的,所以函数调用分布函数必须包含随机数生成器作为参数.因为它不允许我用参数调用它,所以我必须写一个类来为我做这个.

我写的课是这样的:

class RandGen
{
public:
RandGen()
: generator()
, norm_dist(0.0,1.0)
, random_seed(static_cast<unsigned>(std::time(NULL)))
{}

double give_rnd() { return (double) norm_dist(generator); }

private:
base_gen_t generator;
boost::random::normal_distribution<double> norm_dist; //Standard normal    distribution
unsigned random_seed;
};
Run Code Online (Sandbox Code Playgroud)

在尝试编译整个事情时,我收到以下错误:

 error: cannot convert ‘RandGen::give_rnd’ from type ‘double (RandGen::)()’ to type ‘double (RandGen::*)()’
Run Code Online (Sandbox Code Playgroud)

我不知道编译器要我在这里做什么,或者为什么它在这方面有这么多麻烦.任何建议都非常感谢.

Ben*_*ley 10

您需要传递一个可调用对象.也就是说,函数指针(不是成员函数指针,它是什么mygen.give_rnd)或重载类的对象operator().您可以将功能更改give_rnd为:

double operator()() { return (double) norm_dist(generator); }
Run Code Online (Sandbox Code Playgroud)

然后,直接将对象传递给 std::generate

std::generate(..., ..., mygen);
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因,你想保持你的RandGen课程原样,你需要将它包装在另一个functor或lambda中:

std::generate(..., ..., [&mygen]() { return mygen.give_rnd(); });
Run Code Online (Sandbox Code Playgroud)

  • 建议你接受本杰明的回答. (2认同)