我已经尝试了几个小时来找到gcc中使用的rand()函数的实现... 如果有人可以引用我的文件包含它的实现或带有实现的网站,我将不胜感激。
顺便说一下,哪个目录(如果重要的话,我正在使用Ubuntu)包含gcc编译器的c标准库实现?
答案 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.c
和 rand_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*(2deg - 1) 是一个
近似仅适用于大度,当移位周期
注册是主导因素。当 deg 等于 7 时,
周期实际上比预测的 7*(2**7 - 1) 长得多
这个公式。 */