有没有办法通过RcppEigen将随机状态传递给Eigen的setRandom
?还是我需要使用runif
?通过RcppEigen随机状态设置随机
下面是一个例子:
// [[Rcpp::depends(RcppEigen)]]
#include <RcppEigen.h>
using namespace Rcpp;
using Eigen::MatrixXd;
using Eigen::VectorXd;
// [[Rcpp::export]]
NumericVector fx() {
RNGScope scope;
MatrixXd x(3,2);
x=x.setRandom();
x.col(1)=as<VectorXd>(runif(3,0,1));
return wrap(x);
}
测试它:
set.seed(42); fx()
# [,1] [,2]
#[1,] -0.8105760 0.9148060
#[2,] 0.6498853 0.9370754
#[3,] 0.6221027 0.2861395
set.seed(42); fx()
# [,1] [,2]
#[1,] -0.9449154 0.9148060
#[2,] 0.8063267 0.9370754
#[3,] -0.0673205 0.2861395
注如何塔2(即,runif
)是可再现的,但第1列(即,setRandom
)不是。
是的,我也发现我可以使用'srand',但这意味着我必须使用种子参数。我当然可以这样做,但是我必须在R级处理与'set.seed'的接口,这似乎不是最优的。 – Roland
你有没有看到我说的*正交*?这些是**两个不同的RNG **,其中一个实际上并不好。但总之,当你坚持使用两个不同的RNG时,你还需要种两个不同的RNG。没有免费的午餐,所有这一切。 –
我明白这一点。我还会基准测试'as(runif(3,0,1));'替代方法的速度。如果速度太慢,我可以使用'sample。int(2^31-1,1)'得到一个整数,我传递给'srand'。 –
Roland