Я работаю над пакетом , который использует случайные числа из RcppArmadillo.Пакет запускает алгоритмы MCMC, и для получения точной воспроизводимости пользователь должен иметь возможность задать начальное число случайных чисел.При этом кажется, что функция arma::randg()
для генерации случайных чисел из гамма-распределения возвращает разные значения для разных платформ.Это не относится к arma::randu()
или arma::randn()
.Может ли это быть связано с тем, что arma::randg()
требует C ++ 11?
Вот что я получаю на macOS 10.13.6 с R3.5.2:
library(Rcpp)
library(RcppArmadillo)
sourceCpp(code = '
#include <RcppArmadillo.h>
using namespace Rcpp;
// [[Rcpp::plugins(cpp11)]]
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
double random_gamma() {
return arma::randg();
}
// [[Rcpp::export]]
double random_uniform() {
return arma::randu();
}
// [[Rcpp::export]]
double random_normal() {
return arma::randn();
}
'
)
replicate(2, {set.seed(1); random_gamma()})
#> [1] 1.507675 1.507675
replicate(2, {set.seed(432); random_gamma()})
#> [1] 0.02234341 0.02234341
replicate(2, {set.seed(1); random_uniform()})
#> [1] 0.2655087 0.2655087
replicate(2, {set.seed(1); random_normal()})
#> [1] -1.390378 -1.390378
Создано в 2019-02-22 с помощью представительного пакета (v0.2.1)
Вот что я получаю в Windows 10 с R3.5.2:
library(Rcpp)
library(RcppArmadillo)
sourceCpp(code = '
#include <RcppArmadillo.h>
using namespace Rcpp;
// [[Rcpp::plugins(cpp11)]]
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
double random_gamma() {
return arma::randg();
}
// [[Rcpp::export]]
double random_uniform() {
return arma::randu();
}
// [[Rcpp::export]]
double random_normal() {
return arma::randn();
}
'
)
replicate(2, {set.seed(1); random_gamma()})
#> [1] 0.2549381 0.2549381
replicate(2, {set.seed(432); random_gamma()})
#> [1] 0.2648896 0.2648896
replicate(2, {set.seed(1); random_uniform()})
#> [1] 0.2655087 0.2655087
replicate(2, {set.seed(1); random_normal()})
#> [1] -1.390378 -1.390378
Создано в 2019-02-22 с помощью пакета представ (v0.2.1)
Как видно, случайные числа, сгенерированные с помощью arma::randg()
внутренне непротиворечивы, но различаются для разных платформ.
Я попытался установить семена, используя инструкции в документации Armadillo:
library(Rcpp)
library(RcppArmadillo)
sourceCpp(code = '
#include <RcppArmadillo.h>
using namespace Rcpp;
// [[Rcpp::plugins(cpp11)]]
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
double random_gamma(int seed) {
arma::arma_rng::set_seed(seed);
return arma::randg();
}
'
)
replicate(4, random_gamma(1))
#> Warning in random_gamma(1): When called from R, the RNG seed has to be set
#> at the R level via set.seed()
#> [1] 1.3659195 0.6447221 1.1771862 0.9099034
Создано в 2019-02-22 с помощью пакета Представить (v0.2.1)
Однако, как показывает предупреждение и результат показывает, начальное число не устанавливается таким образом.
Есть ли способ получения воспроизводимых результатов между платформами при использовании arma::randg()
, или мне нужно реализовать гамма-распределение, используя некоторые из других генераторов случайных чисел, доступных в RcppArmadillo?
Обновление
Как указано в комментарии, использование R::rgamma()
решает эту проблему.Следующий код возвращает одинаковые числа как на Mac, так и на Windows:
library(Rcpp)
sourceCpp(code = '
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
double random_gamma() {
return R::rgamma(1.0, 1.0);
}
'
)
replicate(2, {set.seed(1); random_gamma()})
#> [1] 0.1551414 0.1551414
Создано в 2019-02-22 с помощью пакета Представить (v0.2.1)
Это решает это для меня.Однако я не уверен, что проблема решена, поскольку это выглядит как неожиданное поведение, поэтому оставьте его открытым.