我在使此示例正常运行时遇到问题。 目前,它为每次迭代和种子输入生成相同的随机样本,尽管种子如af::getSeed((所示而变化。
#include "RcppArrayFire.h"
#include <random>
using namespace Rcpp;
using namespace RcppArrayFire;
// [[Rcpp::export]]
af::array random_test(RcppArrayFire::typed_array<f64> theta, int counts, int seed){
const int theta_size = theta.dims()[0];
af::array out(counts, theta_size, f64);
for(int f = 0; f < counts; f++){
af::randomEngine engine;
af_set_seed(seed + f);
//Rcpp::Rcout << af::getSeed();
af::array out_temp = af::randu(theta_size, u8, engine);
out(f, af::span) = out_temp;
// out(f, af::span) = theta(out_temp);
}
return out;
}
/*** R
theta <- 1:10
random_test(theta, 5, 1)
random_test(theta, 5, 2)
*/
直接的问题是,您在循环的每次迭代中创建一个随机引擎,但设置了全局随机引擎的种子。要么通过engine.setSeed(seed)
设置本地引擎的种子,要么一起删除本地引擎,让af::randu
默认使用全局引擎。
但是,在循环的每一步中更改种子仍然是"不寻常的"。通常只设置一次种子,例如:
// [[Rcpp::depends(RcppArrayFire)]]
#include "RcppArrayFire.h"
// [[Rcpp::export]]
af::array random_test(RcppArrayFire::typed_array<f64> theta, int counts, int seed){
const int theta_size = theta.dims()[0];
af::array out(counts, theta_size, f64);
af::setSeed(seed);
for(int f = 0; f < counts; f++){
af::array out_temp = af::randu(theta_size, u8);
out(f, af::span) = out_temp;
}
return out;
}
顺便说一句,只要您的设备有足够的内存,并行化它是有意义的。例如,您可以使用af::randu(counts, theta_size, u8)
一次性生成随机counts x theta_size
矩阵。