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 矩阵。