在R代码中传递种子/设置种子/ C.

我在R代码中制作C.

在我的C代码中,我使用rand()函数生成随机数。 R-ext.pdf说我必须使用命令设置种子;

GetRNGstate(); PutRNGstate(); 

虽然我使用上面的这些命令,但我仍然为同一种子获得不同的值。 你能帮我一下吗?

最小的例子是:

在C:

 # include  # include  # include  # include  SEXP example(){ SEXP output; GetRNGstate(); PROTECT(output = allocVector(INTSXP, 1)); INTEGER(output)[0] = rand() % 50; PutRNGstate(); UNPROTECT(1); return(output); } 

在R:

 dyn.load("example.so") ## The following codes return different values at ever run set.seed(1) .Call("example") 

提前致谢。

这是您思考中的逻辑错误 – 您正确设置种子,从代码初始化R RNG ……但随后调用系统RNG而不是R RNG。

unif_rand() (或norm_rand() )替换rand() ,你应该设置。

Rcpp使这一切变得更加容易,并且您可以从各种分发函数中获取绘图的矢量化访问权限(但是如果您愿意,您当然可以在C中手动完成所有这些操作)。

通过使用来自Rcpp的 cppFunction() ,我们现在也处理RNGScope ,后者又提供了GetRNGstate() / PutRNGstate() (虽然较旧的示例仍然显示RNGScope实例化;添加它没有任何危害,因为它相当于引用计数) 。

所以它真的是一个单行程来定义,自动扩展,编译和加载:

 R> cppFunction("double myrand() { return norm_rand(); }") R> for (i in 1:5) { set.seed(42); cat(i, " -- ", myrand(), "\n") } 1 -- 1.37096 2 -- 1.37096 3 -- 1.37096 4 -- 1.37096 5 -- 1.37096 R> 

而没有重播就得到了

 R> for (i in 1:5) { cat(i, " -- ", myrand(), "\n") } 1 -- -0.564698 2 -- 0.363128 3 -- 0.632863 4 -- 0.404268 5 -- -0.106125 R> 

最后,如果你真的想要你当然可以继续使用rand() (但是看看它的sucky性能的文献),然后使用它的播种function而不是R’。