簡體   English   中英

設置隨機種子獨立Rmath庫

[英]setting random seed standalone Rmath library

我嘗試使用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): %f\n", X[i], PHI_X);
  }

  //int PutRNGstate();
}

如果我正確理解, GetRNGstate應該初始化隨機種子而不是使用set_seed但是它對我不起作用。 如果使用它,我總是會生成相同的隨機數鏈。 另外,我在網絡上找到的所有示例都無需聲明就使用GetRNGstate() ,但是我無法使其以這種方式工作並且必須將其聲明為int ,我做錯了嗎? 另外,我應該用GetRNGstate()PutRNGState包裝每個調用一個隨機數生成器,還是在代碼的PutRNGState /結尾處設置它們是否足夠?

我知道從R內調用代碼時Rcpp使這變得容易Rcpp ,但我只是嘗試直接在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 %f\n", rnorm(0.0, 1.0));
    printf("rnorm: %f %f\n", 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中的數字相同,可以通過設置種子來預測。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM