[英]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.