Rcpp中调用自定义Rcpp函数后runif生成重复随机数的异常问题求助
Rcpp中调用自定义Rcpp函数后runif生成重复随机数的异常问题求助
大家好,我最近在Rcpp开发时碰到了一个非常诡异的问题,想请教下社区的各位大佬。
我写了一个名为test的Rcpp函数,它接受一个函数类型的参数g。在test里,我会调用另一个自己写的Rcpp函数ru——这个函数很简单,就是用Rcpp::runif(1)生成一个[0,1]区间的均匀随机数。
如果只是单独循环调用ru,生成的随机数完全正常;但只要在循环里先调用传入的g,再调用ru,所有生成的随机数就全是同一个值了!更奇怪的是,这个问题只在g是Rcpp导出的函数时才会出现,如果g是普通的R函数,一切都运行正常。哪怕g只是简单返回0.0,只要它是Rcpp实现的,就会触发这个异常。
下面是我的代码:
Rcpp代码
#include <Rcpp.h> // [[Rcpp::export]] Rcpp::NumericVector fC() { return Rcpp::wrap(0.0); } Rcpp::NumericVector ru() { return Rcpp::runif(1); } // [[Rcpp::export]] void test(Rcpp::Function g) { Rcpp::Rcout << "first ru" << "\n"; for(int j=0; j<10; ++j) { Rcpp::NumericVector z = g() ; Rcpp::Rcout << ru() <<" "; } Rcpp::Rcout<<"\n\n second ru \n"; for(int j=0; j<10; ++j) Rcpp::Rcout<< ru() <<" "; Rcpp::Rcout<<"\n"; }
R测试代码
# 普通R实现的函数 fR = function() {0.0} # 调用R函数,结果符合预期 set.seed(1) test(fR) # 调用Rcpp实现的函数,出现异常 set.seed(1) test(fC)
运行结果
> test(fR) first ru 0.265509 0.372124 0.572853 0.908208 0.201682 0.89839 0.944675 0.660798 0.629114 0.0617863 second ru 0.205975 0.176557 0.687023 0.384104 0.769841 0.497699 0.717619 0.991906 0.380035 0.777445 > set.seed(1) > test(fC) first ru 0.265509 0.265509 0.265509 0.265509 0.265509 0.265509 0.265509 0.265509 0.265509 0.265509 second ru 0.372124 0.572853 0.908208 0.201682 0.89839 0.944675 0.660798 0.629114 0.0617863 0.205975
可以看到,调用Rcpp函数fC时,第一个循环里每次生成的随机数都是同一个值,第二个不调用g的循环则恢复正常。明明g的逻辑和随机数生成完全无关,为什么调用Rcpp写的g会影响随机数的生成呢?有没有大佬能帮忙解释下这个现象,或者给出解决思路?
备注:内容来源于stack exchange,提问作者Wolfgang Rolke
相关产品推荐
相关产品推荐

