【问题标题】:std::generate - How do I use a random number generator?std::generate - 如何使用随机数生成器?
【发布时间】:2013-06-29 13:55:56
【问题描述】:

在我的编程中,我需要创建 用户定义 数量的 ublas 矢量。我想用std::generate 来做这件事。但是,我遇到编译器错误,这对我来说是不可能的。

我正在使用的代码:

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);
}

我必须专门为函数调用创建一个class,因为std::generate 不允许我使用带有参数的函数作为第三个参数(“gen”,请参阅here。我需要数字是正态分布的,所以对分布函数的函数调用必须包含作为参数的随机数生成器。由于它不允许我用参数调用它,我不得不编写一个类来执行此操作我。

我写的课:

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;
};

我遇到的错误

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

 error: cannot convert ‘RandGen::give_rnd’ from type ‘double (RandGen::)()’ to type ‘double (RandGen::*)()’

我不知道编译器想让我在这里做什么,也不知道为什么它在这方面有这么多麻烦。非常感谢任何建议。

【问题讨论】:

    标签: c++ boost random std ublas


    【解决方案1】:

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

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

    然后,只需将您的对象直接传递给std::generate

    std::generate(..., ..., mygen);
    

    如果出于某种原因,您希望保持 RandGen 类不变,则需要将其包装在另一个仿函数或 lambda 中:

    std::generate(..., ..., [&mygen]() { return mygen.give_rnd(); });
    

    【讨论】:

    • 工作就像一个魅力。真的非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    相关资源
    最近更新 更多