【问题标题】:gcc implementation of rand()rand() 的 gcc 实现
【发布时间】:2010-10-14 12:18:06
【问题描述】:

我已经尝试了几个小时来找到 gcc 中使用的 rand() 函数的实现...... 如果有人可以将我引用到包含其实现的文件或带有实现的网站,将不胜感激。

顺便问一下,哪个目录(如果重要的话,我使用的是 Ubuntu)包含 gcc 编译器的 c 标准库实现?

【问题讨论】:

  • GCC 根本没有实现 rand(),它是一个编译器,所有函数都来自库,在这种情况下来自 glibc。

标签: gcc


【解决方案1】:

rand 包含对函数 __random 的调用,该函数主要只是调用 random_r.c 中名为 __random_r 的另一个函数。

请注意,上面的函数名称是 glibc 源代码库的超链接,版本为 2.28。

glibc 随机库支持两种生成器:一种是简单的linear congruential,另一种是更复杂的linear feedback shift register。可以构造任一实例,但调用rand 时使用的默认全局生成器使用线性反馈移位寄存器生成器(参见unsafe_state.rand_type 的定义)。

【讨论】:

  • 看起来它可以在线性同余生成器和“更高级”(原文如此)算法之间进行选择。
  • @ninjalj:你是对的,更高级的是默认设置。我错了。
  • @BlueRaja-DannyPflughoeft:谢谢;固定。
【解决方案2】:

您将在 GNU GLIBC 项目中找到 GCC 使用的 C 库实现。

你可以下载它的源代码,你应该会找到rand() 的实现。带有函数定义的源代码通常不会安装在 Linux 发行版上。只有我猜你已经知道的头文件通常存储在/usr/include目录中。

如果你熟悉GIT源代码管理,你可以这样做:

$ git clone git://sourceware.org/git/glibc.git

获取 GLIBC 源代码。

【讨论】:

    【解决方案3】:

    文件可通过 FTP 获得。我发现在stdlib中使用的rand()还有更多,来自[glibc][2]。从here 获得的2.32 version (glibc-2.32.tar.gz) 中,stdlib 文件夹包含一个random.c 文件,该文件说明使用了简单的线性同余算法。该文件夹还有rand.crand_r.c 可以显示更多源代码。包含在同一文件夹中的 stdlib.h 将显示用于宏的值,例如 RAND_MAX

    /* 改进的随机数生成包。除了 标准的 rand()/srand() 接口,这个包也有一个 特殊状态信息接口。调用 initstate() 例程 带有一个种子、一个字节数组和一个字节数 被传入;然后将该数组初始化为包含 具有那么多状态的随机数生成信息 信息。状态信息量的合适大小是 32、64、128 和 256 字节。状态可以通过调用来切换 setstate() 函数具有与初始化相同的数组 初始化状态()。默认情况下,包以 128 字节的状态运行
    信息并生成比线性更好的随机数
    同余生成器。如果状态信息量较少 超过 32 个字节,一个简单的线性同余 R.N.G.用来。 在内部,状态信息被视为一个 long 数组; 数组的第零个元素是 R.N.G 的类型。正在使用 (小整数);数组的其余部分是状态 R.N.G. 的信息因此,32 字节的状态信息 将提供 7 个多头的状态信息,这将允许 七次多项式。 (注:状态的第零个字
    信息中还存储了一些其他信息;见设置状态 详情)。随机数生成技术是线性的 反馈移位寄存器方法,采用三项式(因为有 以这种方式总结的术语更少)。在这种方法中,最少 状态表中所有数字的重要位将充当 线性反馈移位寄存器,周期为 2^deg - 1 (其中 deg 是所使用的多项式的次数,假设 多项式是不可约的和原始的)。更高阶 位将有更长的周期,因为它们的值也是 受低位伪随机执行的影响。
    生成器的总周期约为 deg*(2deg - 1);因此 将状态信息量翻倍对
    发电机的周期。注意: deg*(2
    deg - 1) 是 近似只适用于大度,当移位的周期 寄存器是主导因素。当 deg 等于 7 时, 周期实际上比预测的 7*(2**7 - 1) 长得多 这个公式。 */

    【讨论】:

      猜你喜欢
      • 2010-11-13
      • 1970-01-01
      • 2021-02-13
      • 2013-09-09
      • 1970-01-01
      • 2013-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多