作为课程的一部分,我需要找到并重新编码一个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个数字长。有人可以帮我找到原始发电机或者教我如何从序列中找到发电机吗?谢谢!
答案 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()