2016-11-18 79 views
-2

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

#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

我不知道我的理解。你只是问如何找出默认种子是什么? – Barmar

+0

或者你需要知道'rand()'使用的是哪种RNG算法? – Barmar

+0

rand()使用的算法不是标准化的 - 它取决于你的实现。如果你的问题是找到起始种子,那么使用'srand()' - 那么你就会知道起始种子,并且能够在闲暇时改变它。 (请记住,通常只需要调用'srand()'一次)。 – Peter

回答

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()(或种子,如果它是第一次调用)的结果的状态变量,对其执行排列,然后把它写回到状态变量。