设置随机种子独立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): %fn", X[i], PHI_X);
}
//int PutRNGstate();
}
如果我正确理解,GetRNGstate
应该初始化随机种子而不是使用set_seed
,但对我不起作用。如果使用它,我总是生成相同的随机数链。此外,我在Web使用GetRNGstate()
中发现的所有示例而无需声明它,但是我不能以这种方式使用它,并且必须将其声明为int
,我做错了吗?此外,我应该用GetRNGstate()
和PutRNGState
包装每个随机号码生成器,还是将它们设置在代码的开始/结束时足够?
我知道Rcpp
从R
中调用代码时会变得容易得多,但是我只是尝试直接测试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相同的数字,可以预见的是设置种子。
相关文章:
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 独立读取-修改-写入顺序
- 带有多个独立参数的C++For循环
- 通过命令行在Visual Studio中编译单个独立文件
- 如何将独立的 c 应用程序组合到 c++ 应用程序中?
- 我们能否在stm32f中使用硬件定时器控制两个独立的进程
- antlr 规则上下文是否可以独立于目标
- 查找存储在二叉搜索树的所有非叶子中的数据总和?(返回整数的独立递归函数
- 多个 rocksdb 实例:使用单个共享缓存还是多个独立缓存?
- 在路径的独立Qt项目中包括外部库
- emplace_back初始化列表错误,当初始化列表在独立变量上工作时
- 为什么不同的翻译单元没有独立和沙盒的内存空间?
- 如何创建独立于平台的宏来包装编译器扩展?
- 使用system()创建独立的子进程
- 独立于编译器的类名
- 独立于实现的浮点/整数转换
- 在C++中将内部类实现为具有名称空间的独立类有什么好处
- 如何在C++中创建总是在循环中接受新输入的独立进程
- 如何在C++中打开多个独立的终端窗口
- 设置随机种子独立rmath库