R 什么';是什么导致了这种奇怪的随机数发生器行为?

R 什么';是什么导致了这种奇怪的随机数发生器行为?,r,plyr,rcpp,R,Plyr,Rcpp,我试图为一些模拟研究制作一些可复制的示例,因此我使用set.seed从“随机”部分获得一致的结果。然而,我注意到我有时会得到不同的结果 我试图把这个范围缩小到一个最小的可重复的例子,但它似乎需要多个元素来触发这个bug 这就是应该发生的事情: library(RcppExamples) set.seed(1) RcppRNGs(3) # rnorm rt rpois # 1 -0.6264538 1.5144787 1 # 2 0.1836433 -0

我试图为一些模拟研究制作一些可复制的示例,因此我使用
set.seed
从“随机”部分获得一致的结果。然而,我注意到我有时会得到不同的结果

我试图把这个范围缩小到一个最小的可重复的例子,但它似乎需要多个元素来触发这个bug

这就是应该发生的事情:

library(RcppExamples)

set.seed(1)
RcppRNGs(3)
#        rnorm         rt rpois
# 1 -0.6264538  1.5144787     1
# 2  0.1836433 -0.3536704     0
# 3 -0.8356286 11.4386179     1
rnorm(3)
# [1]  1.12493092 -0.04493361 -0.01619026

这段代码似乎是激活bug的原因:

library(plyr)
S <- llply(1:100, function(.) Sys.sleep(1), .progress="text")
# |==========================                                        |  25%
我应该得到与第一个示例中相同的结果,但是
rnorm
给出了不同的数字

问题似乎是Rcpp不再影响随机数种子:

set.seed(1)
rnorm(3)
# [1] -0.6264538  0.1836433 -0.8356286
考虑到这里的所有交互部分,我应该向谁提交错误报告


这是我的
sessionInfo()
输出:

R version 3.1.2 (2014-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_New Zealand.1252  LC_CTYPE=English_New Zealand.1252    LC_MONETARY=English_New Zealand.1252 LC_NUMERIC=C                        
[5] LC_TIME=English_New Zealand.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] plyr_1.8.1         RcppExamples_0.1.6 Rcpp_0.11.3       

loaded via a namespace (and not attached):
[1] tools_3.1.2

llply
进入
loop\u apply
,最终调用此函数:

// [[Rcpp::export]]
List loop_apply(int n, Function f) {
  List out(n);

  for(int i = 0; i < n; ++i) {
    out[i] = f(i + 1);
  }

  return out;
}
loop\u apply
的末尾,我们应该得到一个调用
exitRNGScope

    // [[Rcpp::register]]
    unsigned long exitRNGScope() {
        RNGScopeCounter--;
        if (RNGScopeCounter == 0) PutRNGstate();
        return RNGScopeCounter ;
    }
问题是,由于中断,我们永远无法访问
exitRNGScope
,因此当
RcppRNGs
调用
enterngscope
时,我们会认为不需要调用
GetRNGstate
,因此种子没有得到正确处理


也许
loop\u apply
应该调用
checkUserInterrupt
,但我不确定这是否能完全解决问题

对于我们这些不使用llply的人,你能解释一下“停止”按钮是什么以及它的作用吗?您发布的命令序列中没有显示发生了什么。我所能提供的只是:如果你已经终止了某个东西,那么你的
exactRLRT
调用可能会在开始时终止,因此不会导致生成的随机数序列发生变化。RGui和Rstudio中有一个停止按钮。如果你在终端上运行R,我想你可以用Ctrl-C做同样的事情。哦,你完全中断了一个正在运行的函数,留下$Dedity知道周围有什么碎屑。那么不管怎样,
x
(以及fml1)在每种情况下的值是多少?@Pascal如果是这种情况,那么上面的示例就不会出现。我不明白这里有什么问题。再次播种。另外,您声称需要可再现性,但在任意时间点击“停止”按钮不可再现。您将
loop\u apply
甚至看到中断吗?大部分时间将花在
f
上,我想这就是为什么“停止”已经起作用了。这也是我关心的问题。这就是为什么我认为这是一个Rcpp错误。谢谢你提交错误报告。当然。我将看看我能做些什么,在Rcpp中提供一个补丁。根据德克的说法,这是用户错误。所以我可能不会用我的时间在Rcpp中解决这个问题。我将在Rcpp11和Rcpp14中执行此操作,因为我认为这是一个bug。
    // [[Rcpp::register]]
    unsigned long enterRNGScope() {
        if (RNGScopeCounter == 0) GetRNGstate();
        RNGScopeCounter++;
        return RNGScopeCounter ;
    }
    // [[Rcpp::register]]
    unsigned long exitRNGScope() {
        RNGScopeCounter--;
        if (RNGScopeCounter == 0) PutRNGstate();
        return RNGScopeCounter ;
    }