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

标签 c++ boost random std ublas

在我的编程中,我需要创建一个用户定义数量的ublas vector 。我想用 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::*)()’

我不知道编译器要我在这里做什么,或者为什么它会遇到这么多麻烦。非常感谢任何建议。

最佳答案

您需要传递一个可调用对象。也就是说,函数指针(不是成员函数指针,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(); });

关于c++ - std::generate - 如何使用随机数生成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17380926/

相关文章:

java - 使用 BufferedWriter 在 Java 中写入文件

c++ - Flandmark 检测器无法在 C++ 中工作

c++ - 如何制作不可访问的类变量

c++ - 在我的 Mac 上编译时,当我使用 "gcc"编译但不使用 clang++ 时出现此错误

c++ - 变量返回类型

c++ - 为什么这段使用 `::boost::bind` 的代码会出现编译错误?

c - 在 C 中以均匀概率有效地从文本文件中选择随机行?

java - 使用for循环的随机数加法器

java - super 库链接不起作用

c++ - 使用 boost::property_tree 写入 CDATA XML 节点