在Rcpp和R中生成相同的随机变量

时间:2013-12-17 23:17:16

标签: r debugging rcpp sampling

我正在将我的采样算法从R转换为Rcpp。 Rcpp和R的输出不匹配Rcpp代码中存在一些错误(由于随机化,差异不同)。我试图将Rcpp的内部变量与R代码的内部变量相匹配。然而,这是有问题的,因为来自分发的采样器的随机化。

 Rcpp::rbinom(1, 1, 10) 
 rbinom(1, 1, 10)  

如何让代码在R和Rcpp中提供相同的输出,我的意思是从R和Rcpp设置公共种子?

1 个答案:

答案 0 :(得分:4)

你在这里遇到了很多问题:

  1. rbinom(1,1,10)是胡说八道,它会让你'警告信息:在rbinom(1,1,10):NAs产生'(我在这里加入两行进行显示)。

    < / LI>
  2. 因此,我们假设你编写了rbinom(10, 1, 0.5),它会从二分法中生成10个绘图,其中p=0.5绘制一个或零。

  3. 通过Rcpp属性免费获得的RNGScope个对象(见下文),Rcpp文档非常清楚地使用相同的种子,使用相同的种子。

  4. 见证这一点(缩进以适应第一行)

    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个值。重置种子并在相同参数化下检索十个值会得到相同的值。

    这将适用于所有随机分布,除非我们引入了可能发生的错误。