我的问题应该很简单,但我一直没能让它发挥作用。 我需要从 Eigen 生成一个随机数,设置其范围,并将其分配给 t0 一个双精度数。 我尝试过的所有组合都失败了,包括另一篇文章中建议的组合。
double Trand = Eigen::VectorXd(1) *0.5 + 0.5;
我收到一条错误消息,指示“+0.5”是双精度向量,而不是特征向量。 所以我尝试了这个:
double Trand = Eigen::VectorXd(1).cast<double>() * 0.5 + 0.5;
出现相同的错误,标记加法运算,但不标记乘法。 这在上一篇文章中被建议作为解决方案,但失败了,与上面相同。
m = LO+(ArrayXXd::Random(m,n)*0.5+0.5)*(HI-LO)
任何帮助表示赞赏。
value()
。另请注意,使用像 VectorXd
这样的动态大小类型在这里非常浪费,因为它会强制进行临时动态分配。这样会更有效率:
using Vector1d = Eigen::Matrix<double, 1, 1>;
double Trand = Vector1d::Random().value() * 0.5 + 0.5;
但是,Eigen 的随机数生成并不适合生产使用。它更多的是一个调试和测试工具。他们警告自己:
请注意,所有生成随机矩阵的函数都不是可重入的,也不是线程安全的。其中包括
和DenseBase::Random()
,尽管调用了DenseBase::setRandom()
。这是因为这些函数基于不可重入的Eigen::initParallel()
。对于线程安全的随机生成器,我们建议使用 c++11 随机生成器或std::rand
。boost::random
rand()
也不能保证提供高随机性值。使用现代 C++ 生成器。看起来您想要均匀的真实分布。那里包含了可行的示例。