在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’。