GSL中的随机数生成

随机数生成

    本库提供了大量随机数生成器,可以通过统一接口访问它们。通过改变环境变量,允许您在运行时选择不同的生成器和种子,这样您就可以在生成器之间轻松切换,而不需要重新编译程序。生成器的每个实例都跟踪自己的状态,从而允许在多线程程序中使用生成器。其他函数用于将均匀随机数转换为连续或离散概率分布(如高斯分布、对数正态分布或泊松分布)的样本。

     这些函数都声明在头文件gsl_rng.h中。

18.1 关于随机数的一般性意见

1988年,帕克和米勒写了一篇题为《随机数生成器:好的很难找到》的论文。[Commun.: ACM, 31, 1192-1201]。幸运的是,一些优秀的随机数生成器是可用的,但仍普遍使用一些较差的生成器。您可能对计算机上系统提供的随机数生成器感到满意,但是您应该意识到,随着计算机速度的加快,对随机数生成器的需求也会增加。如今,一个调用了数百万次随机数生成器的模拟程序,往往在你穿过大厅到达咖啡机并返回之前就已经完成了。

皮埃尔·莱克耶写了一篇关于随机数生成器的非常好的评论,在《模拟手册》的第4章,杰里·班克斯编辑 (Wiley, 1997)。本章可以在莱克耶的ftp站点的postscript中找到(参见参考资料)。Knuth关于半数值算法的书(最初出版于1968年)用了170页来描述随机数生成器,最近在其第三版(1997年)中进行了更新。这是一部杰出的经典之作。如果你没有这本书,你应该马上停止阅读,跑到最近的书店去买。

一个好的随机数生成器将同时满足理论和统计特性。理论特性通常很难获得(它们需要真正的数学计算!),但是人们更喜欢具有长周期、低序列相关性和不是“主要落在飞机上”的趋势的随机数生成器。用数值模拟进行了统计试验。通常情况下,随机数产生器用于估计某个数量,而概率论为该数量提供了精确的答案。与这个确切答案的比较提供了一种“随机性”的衡量标准。

18.2 随机数生成器接口

    重要的是要记住,随机数生成器不是像正弦或余弦那样的“实”函数。与实际函数不同,对随机数生成器的连续调用产生不同的返回值。当然,这正是随机数生成器所需要的,但是要实现这种效果,生成器必须跟踪某种“状态”变量。有时,这个状态只是一个整数(有时只是前面生成的随机数的值),但通常情况下,它要复杂得多,可能涉及整个数字数组,可能还会抛出一些索引。要使用随机数生成器,您不需要知道组成状态的细节,除此之外,不同的算法还会有所不同。

gsl_rng_type

gsl_rng

随机数生成器库使用两个特殊的结构体,gsl_rng_type保存关于每种生成器类型的静态信息,gsl_rng描述从给定gsl_rng_type创建的生成器的实例。

本节描述的函数都生命在头文件gsl_rng.h中。

18.3 随机数生成器的初始化

gsl_rng * gsl_rng_alloc(const gsl_rng_type * T)

    本函数根据随机数生成器类型T新建一个实例,并返回它的指针。例如,下面的代码创建了一个陶斯沃思生成器的实例:

gsl_rng * r = gsl_rng_alloc (gsl_rng_taus);

如果没有足够的内存来创建生成器,那么函数将返回一个空指针,并使用错误代码GSL_ENOMEM调用错误处理程序。

使用默认种子gsl_rng_default_seed自动初始化生成器。默认情况下这是零,但是可以直接更改,也可以使用环境变量GSL_RNG_SEED更改。

本章后面将介绍可用生成器类型的详细信息。

void gsl_rng_set(const gsl_rng * r, unsigned long int s)

本函数初始化(或“种子”)随机数生成器。如果生成器在两次不同的运行中被赋予相同的s值,则通过对下面例程的连续调用将生成相同的随机数流。如果提供不同的s≥1值,那么生成的随机数流应该是完全不同的。如果种子s为零,则使用原始实现中的标准种子。例如,ranlux生成器的原始Fortran源代码使用了314159265的种子,因此在使用gsl_rng_ranlux时,选择s = 0可以复制这个种子。

在同一生成器中使用多个种子时,请选择大于零的种子值以避免与默认设置冲突。

注意,大多数生成器只接受32位种子,更高的值被约去模232。对于范围较小的生成器,最大种子值通常会更小。

void gsl_rng_free(gsl_rng * r)

本函数释放生成器r的相关内存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值