Mam pewne problemy z zaszczepienie zdefiniowane przez użytkownika RNG w R. Wydaje się, żeSiew użytkownikowi dostarczana generatora liczb losowych w R
set.seed(123, kind='user', normal.kind='user')
faktycznie nie przechodzą 123
do inicjalizacji RNG zdefiniowane przez użytkownika.
Powróciłem do dokumentacji dostępnej pod numerem ?Random.user
i wypróbowałem podany tam przykładowy kod, z drobną modyfikacją, którą wydrukuję, przekazując materiał siewny do funkcji user_unif_init
(pełny kod poniżej).
Kroki do odtworzenia:
- Wklej poniższy kod w
urand.c
- Run
R CMD SHLIB urand.c
- Otwórz
R
uruchom następujące polecenia:
> dyn.load('urand.so') > set.seed(123, kind='user', normal.kind='user') Received seed: 720453763 Received seed: 303482705 // any other numbers than 123
Oto pełny kod użyłem w 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;
}
Każda pomoc będzie bardzo mile widziane!
Dzięki za spojrzenie! Miło jest wiedzieć, że jest spójny, ale to naprawdę nie rozwiązuje mojego problemu. Muszę być w stanie uzyskać '' 123'' w funkcji C. Czy istnieje sposób na ominięcie lub cofnięcie czarnej magii, którą R wprowadza w ten pozornie straighforward proces? – GjjvdBurg
Dzięki za aktualizację! Potrzebuję kontroli nad nasieniem dla konkretnej aplikacji. Twoje rozwiązanie jest miłe, ale nie odpowiada na moje pytanie. Zastanawiam się, co R robi z nasionami iw jakim celu byłoby użyteczne. – GjjvdBurg