2016-11-18 76 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()(或種子,如果它是第一次調用)的結果的狀態變量,對其執行排列,然後把它寫回到狀態變量。