如何找到C库中使用的确切rand()?

时间:2016-11-18 22:33:15

标签: c++ c random sequence-generators number-sequence

作为课程的一部分,我需要找到并重新编码一个rand()随机数生成器,它输出与原始数字相同的数字。起始序列是1804289383 846930886 1681692777 1714636915 1957747793 424238335 719885386 1649760492 596516649 1189641421 1025202362并且可以在http://ideone.com/H7tsSI生成

#include <stdlib.h>     /* rand */
#include <iostream>
using namespace std;

int main ()
{
    for (int i = 0 ; i< 10 ; i++) {
        cout << rand() << " ";
    }
    cout << rand();

    return 0;
}

我的问题是我找不到这台发电机的原始来源,我不知道如何从发电机的整个序列中找出发电机的工作方式,这是100个数字长。有人可以帮我找到原始发电机或者教我如何从序列中找到发电机吗?谢谢!

2 个答案:

答案 0 :(得分:1)

根据您的特定编译器,您可能拥有可用的源代码。例如,在Visual Studio 12.0上,rand()源代码为:

int __cdecl rand (
        void
        )
{
        _ptiddata ptd = _getptd();

        return( ((ptd->_holdrand = ptd->_holdrand * 214013L
            + 2531011L) >> 16) & 0x7fff );
}

如果您的编译器不包含其C库的源代码,您可以尝试使用反汇编程序将rand()函数的版本拼凑在一起。一般来说,它们中的大多数都与上面代码的行相同:访问一个状态变量,该变量是最后一次调用rand()的结果(如果它是第一次调用则是种子),执行排列它,然后将其写回状态变量。

答案 1 :(得分:0)

您可以在http://www.gnu.org/software/libc/找到GNU使用的源库实现 如果您熟悉GIT,可以使用GIT源代码管理,如:

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

rand()函数本质上调用不同的函数 - 第一个__random反过来调用__random_r。单击函数名称以引用版本2.15的源存储库

有关详细信息,请参阅此处的答案 - gcc implementation of rand()