1

私はCで、0から999までの乱数を使用して1000個の整数の配列を作成し、その配列に対して何らかのアルゴリズムを実行するプログラムを持っています。アルゴリズムの実行時間をテストするために、プログラムを 10000 回実行してみましたが、実行するたびに、配列はいくつかの配列で同じになり、その後変化します。関数を使用srand()して現在の時刻をシードに供給しましたが、それでも役に立ちません。

rand()これを修正するための代替ソリューションまたは方法はありますか? 私の機能は次のとおりです。

void getarray(int *ptr1, int size, int option){
    int n;
    srand(time(NULL));
    for(n=0; n<size; n++)
        *(ptr1+n) = *(ptr2+n)= rand()%1000; 
}

前もって感謝します!

4

4 に答える 4

4

がジョブにとってより優れrand()た機能であるかどうか、非常に注意深く調査する必要があります。

コンパイラやプラットフォームによって異なりますが、多くの場合、「線形合同ジェネレーター」として実装されています。これは、速度とメモリ使用量の点で非常に便利ですが、統計的特性が貧弱です (つまり、十分な長さのシーケンスが合同乱数によって生成されたかどうかを知ることができます)。ジェネレーターまたはそれが本当にランダムである場合)。

rand()あなたのユースケース(テストアルゴリズムの速度)では、実行がデータの統計的特性に影響されない限り、完全に問題なく使用できます。が線形合同 RNG の場合rand()、数列はパターンを示します。これは、任意の時点で、すべての数が等確率であるとは限らないことを意味します。良い例は、このウィキペディアの写真にあります。

LC NRG

システムには RNG (/dev/random など) とそれに関連する関数も含まれている場合がありますが、それらは高品質の乱数を生成することを意図しておらず、使用するのがかなり遅い場合があることに注意してください。数が足りなくなり、システムがより多くのエントロピーを収集するのを待つことになるかもしれません!

暗号化に十分な統計的特性を備えたシンプルでかなり高速な RNG はISAACです。個人的には、適切な乱数が必要なときはいつでも使用します。

別の代替手段は、 RANDOM.orgまたはHotBitsによって生成されたものとして真の乱数を使用することですが、あなたの場合はやり過ぎかもしれません。

余談ですが、RANDOM.ORG にはRNG に関するすばらしいページrand()があり、PHP関数によって作成された「パターン」の別の例が示されています。

于 2013-05-18T12:15:00.643 に答える