如何为GSL(GNU科学库)调整C++式随机数引擎?
How to adapt a C++-style random number engine for GSL (GNU Scientific Library)?
我有一个满足C++随机数引擎要求的PRNG,如此处所述。(它来自PCG家族(。也就是说,C++标准库分布类可以使用引擎的实例来生成随机数:
pcg_extras::seed_seq_from<std::random_device> seed_source;
pcg32 rng(seed_source);
std::uniform_real_distribution<double> uniformDist(0., 1.);
double randomNumber = uniformDist(rng);
我需要从未包含在<random>
中的发行版生成样本,所以我需要使用 GSL 的函数。如何使用C++引擎来实现此目的?GSL rng 函数都需要一个const gsl_rng *
作为第一个参数。
gsl_rng
的默认创建和使用如下所示:
const gsl_rng_type * T;
gsl_rng * r;
gsl_rng_env_setup();
T = gsl_rng_default;
r = gsl_rng_alloc (T);
double u = gsl_rng_uniform (r);
要使用我自己的引擎,我认为我需要定义一个gsl_rng_type
,如"gsl/gsl_rng.h"
所定义:
typedef struct
{
const char *name;
unsigned long int max;
unsigned long int min;
size_t size;
void (*set) (void *state, unsigned long int seed);
unsigned long int (*get) (void *state);
double (*get_double) (void *state);
}
gsl_rng_type;
我猜想需要的东西是否正确?是否有关于如何定义自定义gsl_rng_type
的示例,尤其是三个必要的成员函数?我的void *state
可能是什么?
我最终做了以下事情来让事情正常进行。请注意,我的随机数引擎是我的程序中的全局变量:g_rng
。
有必要构造一个结构来保存与 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);
查看 GSLrng.c
中定义的gsl_rng_alloc
确认这是正确的设置。
这是正确的。整个公共接口在 https://github.com/LuaDist/gsl/blob/master/rng/gsl_rng.h 中概述
相关文章:
- 为char数组调整zlib-zpipe
- 调整大小后指向元素值的指针unordered_map有效?
- 在C++中调整向量中的索引
- 哪些库可以通过Opencv调整曝光率
- 如何调整 std::vector of Eigen::MatrixXd 的大小
- Alt+Enter 在 Win32 应用中,管理大小调整和分辨率
- 在容量内调整矢量大小时的性能影响
- 将 boost::odeint 与向量类一起使用,而无需调整向量的大小
- 将摄像机调整到俯视图
- Qt 图表条形图调整大小崩溃
- 除非重新绘制大小,否则SDL_Texture在调整大小后呈现黑色
- 调整布局上的 QGraphicsView 小部件的大小
- 如何在构建链接列表时调整头、尾指针
- 如何将旧的 C 样式 #define 映射与现代C++进行调整?
- 当您在此单词中搜索单词时调整字符数组的大小?
- SDL2 调整窗口大小后如何缩放鼠标坐标?
- 如何按另一个向量的方向调整一个向量?
- 使用大小调整大小调整 wxListView 的大小
- 调整大小和复制哈希表数组中的元素
- 具有调整对齐方式的类型定义