我正在将我的采样算法从R转换为Rcpp。 Rcpp和R的输出不匹配Rcpp代码中存在一些错误(由于随机化,差异不同)。我试图将Rcpp的内部变量与R代码的内部变量相匹配。然而,这是有问题的,因为来自分发的采样器的随机化。
Rcpp::rbinom(1, 1, 10)
rbinom(1, 1, 10)
如何让代码在R和Rcpp中提供相同的输出,我的意思是从R和Rcpp设置公共种子?
答案 0 :(得分:4)
你在这里遇到了很多问题:
rbinom(1,1,10)
是胡说八道,它会让你'警告信息:在rbinom(1,1,10):NAs产生'(我在这里加入两行进行显示)。
因此,我们假设你编写了rbinom(10, 1, 0.5)
,它会从二分法中生成10个绘图,其中p=0.5
绘制一个或零。
通过Rcpp属性免费获得的RNGScope
个对象(见下文),Rcpp文档非常清楚地使用相同的种子,使用相同的种子。
见证这一点(缩进以适应第一行)
R> cppFunction("NumericVector cpprbinom(int n, double size, double prob) { \
return(rbinom(n, size, prob)); }")
R> set.seed(42); cpprbinom(10, 1, 0.5)
[1] 1 1 0 1 1 1 1 0 1 1
R> set.seed(42); rbinom(10,1,0.5)
[1] 1 1 0 1 1 1 1 0 1 1
R>
我在这里定义,编译,链接和加载自定义C ++函数cpprbinom()
。然后我设置种子,并检索10个值。重置种子并在相同参数化下检索十个值会得到相同的值。
这将适用于所有随机分布,除非我们引入了可能发生的错误。