我在 R 中播种用户定义的 RNG 时遇到了一些麻烦。似乎
set.seed(123, kind='user', normal.kind='user')
实际上并不传递123
给用户定义的 RNG 初始化。
我回到了可用的文档?Random.user
并尝试了那里给出的示例代码,并稍作修改,我打印了传递给user_unif_init
函数的种子(下面的完整代码)。
重现步骤:
- 将下面的代码粘贴到
urand.c
- 跑
R CMD SHLIB urand.c
- 打开
R
运行以下命令:
> dyn.load('urand.so') > set.seed(123, kind='user', normal.kind='user') Received seed: 720453763 Received seed: 303482705 // any other numbers than 123
这是我使用的完整代码urand.c
:
// ## Marsaglia's congruential PRNG
#include <stdio.h>
#include <R_ext/Random.h>
static Int32 seed;
static double res;
static int nseed = 1;
double * user_unif_rand()
{
seed = 69069 * seed + 1;
res = seed * 2.32830643653869e-10;
return &res;
}
void user_unif_init(Int32 seed_in) {
printf("Received seed: %u\n", seed_in);
seed = seed_in;
}
int * user_unif_nseed() { return &nseed; }
int * user_unif_seedloc() { return (int *) &seed; }
/* ratio-of-uniforms for normal */
#include <math.h>
static double x;
double * user_norm_rand()
{
double u, v, z;
do {
u = unif_rand();
v = 0.857764 * (2. * unif_rand() - 1);
x = v/u; z = 0.25 * x * x;
if (z < 1. - u) break;
if (z > 0.259/u + 0.35) continue;
} while (z > -log(u));
return &x;
}
任何帮助将不胜感激!