我有以下课程:
class TestRandom
{
public:
struct scalar_op
{
std::mt19937 rng;
std::normal_distribution<double> norm;
scalar_op(){}
scalar_op(unsigned long seed){rng = std::mt19937(seed);}
void reset(unsigned long seed=std::mt19937::default_seed){ rng142.seed(seed);norm.reset(); }
double operator()(void) const
{
double n_noise =norm(rng);
return n_noise;
}
};
TestRandom(){}
void reset(unsigned long seed=std::mt19937::default_seed){rand.reset(seed);}
/// Draw nn samples from the gaussian and return them
Eigen::MatrixXd samples(int n)
{
Eigen::MatrixXd noise(3,n);
noise.unaryExpr(rand);
return corr_noise;
}
private:
scalar_op rand;
}; //TestRandom
我想要实现的是首先将随机数生成器重置为
TestRandom r1;
r1.reset(1)
然后用随机样本填充矩阵
Eigen::MatrixXd normal_random = r1.samples(1); // just a sample of random numbers
但是我收到了
的编译错误 error C3848: expression having type 'const std::mt19937' would lose some const-volatile qualifiers in order to call 'unsigned int std::mersenne_twister<_Ty,_Wx,_Nx,_Mx,_Rx,_Px,_Ux,_Sx,_Bx,_Tx,_Cx,_Lx>::operator ()(void)
如果我删除了()运算符的const,代码编译但是不执行operator()内的计算(我可以在调试器中看到这一点)。
指出我的错误并且可能提供解决方法的方法会非常有点。提前致谢
答案 0 :(得分:0)
rng
attribut应声明为mutable
,例如:
mutable std::mt19937 rng;