【问题标题】:How can I find the exact rand() used in a C library? [duplicate]如何找到 C 库中使用的确切 rand()? [复制]
【发布时间】:2016-11-18 22:33:14
【问题描述】:

作为我课程的一部分,我需要找到并重新编码一个 rand() 随机数生成器,它输出与原始数字相同的数字。起始顺序为 1804289383 846930886 1681692777 1714636915 1957747793 424238335 719885386 1649760492 596516649 1189641421 1021@39> 生成

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

【问题讨论】:

  • 我不确定我是否理解。您只是在问如何找出默认种子是什么?
  • 或者你需要知道rand()使用的是什么RNG算法?
  • rand() 使用的算法不是标准化的 - 这取决于您的实现。如果您的问题是寻找起始种子,请使用srand() - 那么您将知道起始种子,并且能够在闲暇时更改它。 (请记住,通常只需要调用一次srand())。
  • 我需要找到RNG算法。我已经搜索并找到了 Eugene Sh 的链接。提供,它没有给我我正在寻找的解决方案。那里的发电机与我正在寻找的发电机不同。生成器在 gcc 4.9.2 中,但是源代码让我很困惑。
  • 我真的不明白这样一个任务的意义。它必须至少包含算法的名称或对“原始”的任何其他引用。

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


【解决方案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() 的结果(如果是第一次调用,则为种子),对其执行排列,然后将其写回状态变量。

【讨论】:

    【解决方案2】:

    您可以在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()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      • 2015-05-18
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      • 2014-05-09
      • 2012-12-30
      相关资源
      最近更新 更多