设置随机种子独立rmath库

setting random seed standalone Rmath library

本文关键字:rmath 独立 种子 随机 设置      更新时间:2023-10-16

我尝试使用R提供的独立Rmath库在C++中生成随机数。

我获得的最好的是:

#include <stdio.h>      /* printf, scanf, NULL */
#include <stdlib.h>     /* malloc, free, rand */
#define MATHLIB_STANDALONE
#include <Rmath.h>
#include <time.h>
int main(){
  int i;
  unsigned int SEED1, SEED2;
  double mu, sigma, PHI_X, *X;
  mu = 0;
  sigma = 1;
  SEED1 = time(NULL);
  SEED2 = time(NULL);
  set_seed(SEED1, SEED2);
  //int GetRNGstate();
  X = (double *) malloc(10);
  for(i = 0; i < 10; i++){
    X[i] = rnorm(mu, sigma);
    PHI_X = pnorm(X[i], mu, sigma, 1, 0);
    printf("X: %f, PHI(X): %fn", X[i], PHI_X);
  }
  //int PutRNGstate();
}

如果我正确理解,GetRNGstate应该初始化随机种子而不是使用set_seed,但对我不起作用。如果使用它,我总是生成相同的随机数链。此外,我在Web使用GetRNGstate()中发现的所有示例而无需声明它,但是我不能以这种方式使用它,并且必须将其声明为int,我做错了吗?此外,我应该用GetRNGstate()PutRNGState包装每个随机号码生成器,还是将它们设置在代码的开始/结束时足够?

我知道RcppR中调用代码时会变得容易得多,但是我只是尝试直接测试C++中的独立版本。出于信息目的,我使用的是Debian Wheezy。

我不确定您的程序有什么问题,但是这是几年前我为自己写的简单,更短的:

// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; 
//         compile-command: "gcc -s -Wall -O3 -I/usr/share/R/include 
//         -o rmath_rnorm rmath_rnorm.c -lRmath -lm" -*-        
// Compare to
//    $ Rscript -e "RNGkind('Marsaglia'); 
//          .Random.seed[2:3] <- c(123L, 456L); rnorm(2)"        
//    [1] -0.2934974 -0.3343770
#include <stdio.h>
#define MATHLIB_STANDALONE 1
#include <Rmath.h>
int main(void) {
    set_seed(123, 456);
    printf("rnorm: %f %fn", rnorm(0.0, 1.0));
    printf("rnorm: %f %fn", rnorm(0.0, 1.0));
    return 0;
}

它仍然可以正常工作:

/tmp$ gcc -s -Wall -O3 -I/usr/share/R/include -o rmath_rnorm 
                  rmath_rnorm.c -lRmath -lm
/tmp$ ./rmath_rnorm 
rnorm: -0.293497
rnorm: -0.334377
/tmp$ Rscript  -e 'RNGkind("Marsaglia"); .Random.seed[2:3] <- c(123L, 456L); rnorm(2)'
[1] -0.293497 -0.334377
tmp$ 

与r相同的数字,可以预见的是设置种子。