有沒有辦法通過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