【发布时间】:2013-01-28 11:58:16
【问题描述】:
我对这个提问者有相反的问题:Passing seed/Setting seed/ C within R code。我的问题是我想使用 R 随机数生成器在 C 代码中生成一个随机数,但是每次运行它时,我都会得到相同的“随机”值。这是我的代码(包括我碰巧正在使用的头文件,这些对于代码 sn-p 来说并非都是必需的):
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <math.h> // C header files
#include <R.h>
#include <R_ext/Utils.h>
#include <Rmath.h>
void main(){
GetRNGstate();
double u = unif_rand();
PutRNGstate();
Rprintf("%f\n",u);
}
现在我在使用 R CMD SHLIB 编译并使用 dyn.load() 后从 R Windows GUI 调用它:
> .C("main")
0.000889
list()
现在如果我关闭 R,重新启动,然后 dyn.load() 再次(但没有第二次编译):
> .C("main")
0.000889
list()
根据我在互联网上找到的各种代码和“编写 R 扩展”手册,这不应该发生。但我可能只是错过了一步?
【问题讨论】:
-
这不是你的问题,但是 (a) 没有标准的
<malloc.h>标头;声明malloc的标头是<stdlib.h>,(b)void main()是错误的,应该是int main(void)。void main()经常表示一本 C 教科书,该教科书的作者并不像他认为的那样了解 C。 -
猜测:你有一个
set.seed调用在你的.Rprofile或类似的东西,每次你开始一个新的 R 会话时都会修复种子? -
@CDRV 不幸的是,无法确定,因为当我启动 R 时,会自动加载其他人的 R 配置文件。但看起来这很可能是问题所在!谢谢你。您是否碰巧知道如何重置随机种子,使其不会每次都一样?