我想unif_rand()
在多线程环境中植入 R 的内部。下面的代码在 2 个线程内生成一个 2 列的均匀随机数矩阵。结果很有趣。
struct mtRunif: public RcppParallel::Worker
{
int Nrow; // number of rows in matrix.
double *v; // point to the 0th element of the 0th column.
void operator() (std::size_t st, std::size_t end)
{
// st = 0 in the 0th thread, 1 in the 1st thread.
double *vst = v + st * Nrow;
for(int i = 0; i < Nrow; ++i)
{
vst[i] = unif_rand();
}
}
mtRunif(int Nrow, double *v): Nrow(Nrow), v(v)
{
RcppParallel::parallelFor(0, 2, *this);
}
};
// [[Rcpp::export]]
NumericMatrix testSeeding(int sampleSize)
{
NumericMatrix rst(sampleSize, 2);
mtRunif(sampleSize, &*rst.begin());
return rst;
}
/***R
N = 100
set.seed(42); tmp = testSeeding(N)
set.seed(42); tmp2 = testSeeding(N)
# see if sequences are identical
range(tmp[, 1] - tmp2[, 1]); range(tmp[, 2] - tmp2[, 2])
# [1] 0 0
# [1] 0 0
N = 1000
set.seed(42); tmp = testSeeding(N)
set.seed(42); tmp2 = testSeeding(N)
range(tmp[, 1] - tmp2[, 1]); range(tmp[, 2] - tmp2[, 2])
# [1] -0.9655154 0.8989870
# [1] -0.969356 0.963239
*/
结果表明set.seed()
控制小样本量的所有线程的随机性?最初我希望set.seed()
在不超过 1 个线程中有效。我不想利用这个结论,因为它可能是绝对错误的。另一方面,是否有unif_rand()
类似于std::srand()
for的播种功能std::rand()
?
谢谢!