В итоге я сделал следующее, чтобы все заработало.Обратите внимание, что мой механизм случайных чисел является глобальной переменной в моей программе: g_rng
.
Необходимо создать структуру для хранения любого состояния, подходящего для ГСЧ.В моем случае я просто держу указатель на pcg32
:
// In some header file, e.g. rng.h
typedef struct
{
pcg32 *rng;
} gsl_pcg_state;
Должны быть определены три функции: «set», «get» и «get_double»:
// In some header file, e.g. rng.h
static void gsl_pcg_set(void *state, unsigned long int seed)
{
((gsl_pcg_state *)state)->rng = &g_rng;
(void)seed; // unused
}
static unsigned long int gsl_pcg_get(void *state)
{
return (*((gsl_pcg_state *)state)->rng)();
}
static double gsl_pcg_get_double(void *state)
{
// Range [0, 1)
return (*((gsl_pcg_state *)state)->rng)() / 4294967296.;
}
Таким образом, можно создать экземпляр gsl_rng_type
:
static const gsl_rng_type gsl_rng_pcg = {
"pcg",
0xffffffffUL,
0,
sizeof(gsl_pcg_state),
&gsl_pcg_set,
&gsl_pcg_get,
&gsl_pcg_get_double
};
Внутри основной программы вы получите ...
gsl_rng *r;
r = gsl_rng_alloc(&gsl_rng_pcg);
// one can now call various gsl_ran_[...] functions
gsl_rng_free(r);
Глядя на gsl_rng_alloc
, как определено в rng.c
из GSL подтверждает, что это правильная установка.