You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 12:03:10