-2

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

#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 个数字)中找出生成器的工作方式。有人可以帮我找到原始生成器或教我如何从其序列中找到生成器吗?谢谢!

4

2 回答 2

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()(如果是第一次调用,则为种子),对其执行置换,然后编写回到状态变量。

于 2016-11-18T22:44:26.050 回答
0

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

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

rand() 函数本质上调用了不同的函数 - 首先是 __random,后者又调用了 __random_r。单击函数名称以引用 2.15 版本的源存储库

有关更多详细信息,请参阅此处的答案 - rand() 的 gcc 实现

于 2016-11-18T22:54:36.460 回答