gcc的rand实现()

时间:2010-10-14 12:18:07

标签: gcc

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

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

3 个答案:

答案 0 :(得分:13)

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

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

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

答案 1 :(得分:9)

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

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

如果您熟悉 GIT 源代码管理,则可以执行以下操作:

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

获取GLIBC源代码。

答案 2 :(得分:0)

文件可通过 FTP 访问。我发现在 rand() 中使用了更多的 stdlib,它来自 [glibc][2]。从从 2.32 version 获得的 here (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 长的状态信息,这将允许 七次多项式。 (注:状态的第零个字
信息中还存储了一些其他信息;参见 setstate 详情)。随机数生成技术是一种线性 反馈移位寄存器方法,采用三项式(因为有 以这种方式总结的术语较少)。在这种方法中,最少 状态表中所有数字的有效位将作为 线性反馈移位寄存器,周期为 2^deg - 1 (其中 deg 是所使用的多项式的次数,假设 多项式是不可约的和原始的)。更高的顺序 位将有更长的周期,因为它们的值也是 受低位伪随机执行的影响。
发电机的总周期约为 deg*(2deg - 1);因此 状态信息量翻倍对
的影响巨大 发电机周期。注意: deg*(2
deg - 1) 是一个 近似仅适用于大度,当移位周期 注册是主导因素。当 deg 等于 7 时, 周期实际上比预测的 7*(2**7 - 1) 长得多 这个公式。 */