首页 > 解决方案 > R 复制()函数不适用于 Rcpp 函数

问题描述

我在使用replicate()R 中的函数通过 Rcpp 函数生成随机数时遇到问题。考虑 R 中的以下函数:

trial <- function(){rnorm(1)}
replicate(10, trial())

它从高斯分布中生成 10 个随机数。它工作得很好,并产生如下结果:

 [1]  0.7609912 -0.2949613  1.8684363 -0.3358377 -1.6043926  0.2706250  0.5528813  1.0228125 -0.2419092 -1.4761937 

但是,我有一个getRan()从高斯分布生成随机数的 c++ 函数。我再次使用复制来调用这样的函数:

replicate(10,getRan())

它创建一个相同数字的向量,如下所示:

> replicate(10,getRan())
 [1] -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932 -1.374932
> replicate(10,getRan())
 [1] -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785 -0.3273785
> replicate(10,getRan())
 [1] -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953 -0.7591953
> replicate(10,getRan())
 [1] -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935 -1.698935

但是,如果我多次调用该函数,它工作正常:

 getRan()
[1] 1.345227
> getRan()
[1] 0.3555393
> getRan()
[1] 1.587241
> getRan()
[1] 0.5313518

那么这里的问题是什么?该函数是否replicate()重复相同的函数返回getRan()而不是getRan()多次调用?它是一个错误吗?

PS:我知道我可以rnorm(n)用来生成n个正常的随机数,但是,我想使用c++函数根据生成随机数进行更复杂的计算

PPS:这是我的 C++ 代码:

double getRan(){
  unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
  std::default_random_engine generator(seed);
  std::normal_distribution<double> distribution (0.0,1.0);
  double epi = distribution(generator);
  return epi;
}

标签: rrcppreplicate

解决方案


这是一个反例,表明它工作得很好:

代码

trialR <- function() { rnorm(1) }
Rcpp::cppFunction("double trialC() { return R::rnorm(0.0, 1.0); }")
Rcpp::cppFunction("Rcpp::NumericVector trialSugar() { return Rcpp::rnorm(1.0, 0.0, 1.0); }")

set.seed(123); replicate(3, trialR())
set.seed(123); replicate(3, trialC())
set.seed(123); replicate(3, trialSugar())

输出

通过Rscript确保新的会话等 pp:

edd@rob:/tmp$ Rscript so50543659.R 
[1] -0.560476 -0.230177  1.558708
[1] -0.560476 -0.230177  1.558708
[1] -0.560476 -0.230177  1.558708
edd@rob:/tmp$ 

推荐阅读