RcppArrayFire 中的随机洗牌
random shuffle in RcppArrayFire
我在将此示例正确 运行 时遇到问题。目前它为每次迭代和种子输入生成相同的随机样本,尽管种子发生变化,如 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
默认使用全局引擎。
但是,在循环的每一步中更改种子仍然是 "unusual"。通常一个人只设置一次种子,例如:
// [[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
矩阵。
我在将此示例正确 运行 时遇到问题。目前它为每次迭代和种子输入生成相同的随机样本,尽管种子发生变化,如 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
默认使用全局引擎。
但是,在循环的每一步中更改种子仍然是 "unusual"。通常一个人只设置一次种子,例如:
// [[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
矩阵。