2016-11-18 3 views
-2

私の勉強の一環として、オリジナルと同じ番号を出力する乱数ジェネレータrand()を見つけて再コーディングする必要があります。起動シーケンスがある719885386 1649760492 596516649 1189641421 1025202362 1804289383 846930886 1681692777 1714636915 1957747793 424238335と私の問題は、私は、この発電機の元のソースを見つけることができないということですhttp://ideone.com/H7tsSICライブラリで使用されている正確な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()の最後の呼び出しの結果であった状態変数にアクセスするか(またはそれが最初の呼び出しであればシード)、順列を実行してからそれを状態変数に書き戻します。

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

のrand()関数は、本質的に異なる機能を呼び出す:

0

あなたはGITに精通している場合http://www.gnu.org/software/libc/ でGNUで使用されるソースライブラリの実装を見つけることができ、次のようなGITソースコード管理を使用することができます - 最初に__randomを呼び出し、次に__random_rを呼び出します。詳細については、バージョン2.15

のソースリポジトリを参照するために関数名をクリックして、ここでの回答を参照してください - gcc implementation of rand()

関連する問題