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 ;
}