std::generate-如何使用随机数生成器
std::generate - How do I use a random number generator?
在我的编程中,我需要创建一个用户定义的数量的公开向量。我想用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);
}
我必须专门为函数调用创建一个CCD_ 2,由于std::generate
不允许我使用带参数的函数作为第三个参数("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;
};
我得到的错误
当试图编译整件事时,我得到了以下错误:
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(); });
相关文章:
- 播种随机数生成器以使用分叉的好方法是什么?
- 如何使用 cpp 设置随机数生成器的语法?
- 如何在不同的C++文件中使用相同的随机数生成器
- 在C++11中使用哪个伪随机数生成器
- 如何使用伪随机数生成器生成一组特定的数字
- 最佳实践:使用随机数生成器的测试代码
- 使用Boost分隔接口和随机数生成器类的实现
- 如何使用CUDA CURAND保存和恢复随机数生成器的状态
- 来自 Stroustrup PPP 的伪随机数生成器,使用 C++,第 8 章,练习 8 和 9
- 当被要求使用随机数生成器时,C++程序在while循环中崩溃
- 错误:使用四进制和随机数生成器进行赋值时,左值需要作为左操作数
- 库中随机数生成器使用的最佳实践/习语
- 使用随机数生成器为随机数生成器池设定种子
- 为什么人们说使用随机数生成器时存在模偏差
- 在多个函数中使用相同的随机数生成器
- std::generate-如何使用随机数生成器
- 使用随机数生成器:多实例或单实例方法
- 使用std::shuffle与自定义随机数生成器
- 以纯粹的方式使用c++随机数生成器
- c++ -11中使用boost封装的随机数生成器