-2

私のコースワークの一環として、オリジナルと同じ数値を出力する rand() 乱数ジェネレーターを見つけて再コーディングする必要があります。開始シーケンスは 1804289383 846930886 1681692777 1714636915 1957747793 424238335 719885386 1649760492 596516649 1189641421 SI1025202362 であり、http://7Hidesone.com で生成できます

#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 個の数字) からジェネレーターがどのように機能するかを理解する方法がわかりません。誰かが元のジェネレーターを見つけるのを手伝ってくれますか、またはそのシーケンスからジェネレーターを見つける方法を教えてくれませんか? ありがとう!

4

2 に答える 2

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()(または最初の呼び出しの場合はシード) にアクセスし、それに対して順列を実行し、次に書き込みます。それを状態変数に戻します。

于 2016-11-18T22:44:26.050 に答える
0

GNU で使用されるソース ライブラリの実装は、http: //www.gnu.org/software/libc/ にあります。GIT に精通している場合は、次のような GIT ソース コード管理を使用できます。

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

rand() 関数は本質的に異なる関数を呼び出します-最初の__randomは次に__random_rを呼び出します。関数名をクリックして、バージョン 2.15 のソース リポジトリを参照します。

詳細については、こちらの回答を参照してください - rand() の gcc 実装

于 2016-11-18T22:54:36.460 に答える