2

このプログラムはランダムな文字列を3回生成します

'step into'を使用してEclipseでデバッグした場合、結果は一意で異なります。

実行したばかりの場合、結果は3回同じ文字列になります

実行方法、デバッグ実行とコンパイル実行によって結果が異なるのはなぜですか?

#include <iostream>
using std::cout;
using std::endl;

#include <string>
using std::string;

#include <ctime>
#include <cstdlib>


string generaterandomstring(int length){
    int i, x, alphabetsize, asciioffset;
    string s1;

    alphabetsize = 26; // size of all lower case letters
    asciioffset = 97; // lower case letters start at 97

    srand ( time(NULL) );

    for ( i = 0; i < length; i++ )
    {
        //generate random number
        x = rand() % alphabetsize + asciioffset;
        cout << "x: " << x;
        //get a letter
        cout << " char: " << char(x);
        //append it to string
        s1 = s1 + char(x);
        cout << " s1: " << s1 << endl;
    }
    return s1;
}

int main() {
    int i;
    string s1;
    int length = 3;

    srand ( time(NULL) );

    for ( i = 0; i < length; i++ )
    {
        s1 = generaterandomstring(length);
        cout << "i is: " << i << " from main s1: " << s1 << endl;
        cout << rand() % 10 << endl;
    }

    cout << "!The End!" << endl; // prints !!!Hello World!!!
    return 0;
}
4

3 に答える 3

1

http://cplusplus.com/reference/clibrary/cstdlib/srand/

疑似乱数ジェネレーターは、シードとして渡された引数を使用して初期化されます。

srand の呼び出しで使用されるすべての異なるシード値に対して、疑似乱数ジェネレーターは、その後の rand の呼び出しで異なる一連の結果を生成することが期待できます。 同じシードを持つ 2 つの異なる初期化は、疑似乱数ジェネレーターに、両方のケースで以降の rand の呼び出しに対して同じ一連の結果を生成するように指示します

http://cplusplus.com/reference/clibrary/ctime/time/

現在のカレンダー時間を time_t オブジェクトとして取得します。

于 2012-09-06T15:21:13.087 に答える
0

srand これは、内部 で呼び出すために発生しますgeneraterandomstring。デバッグ セッション中は、反復間に十分な時間が経過する (1 秒以上) ため、time(NULL)毎回異なる値が返されます。フリーランでは、プログラムはランダムシードを同じ値に設定し、反復ごとに同じ「ランダム」値を取得します。

于 2012-09-06T15:25:44.040 に答える
0

デバッグで機能する理由は、デバッグが十分に遅いため、ミリ秒単位の現在の時間で srand を再初期化すると、異なるランダムな文字列が生成されるためです。リリースではコードが速すぎるため、srand は同じ乱数リストに再初期化されています。他の回答が示唆しているように、srand は 1 回だけ呼び出す必要があります。余談ですが、そこに 1 ミリ秒のスリープを入れると、問題は解消されます。

于 2012-09-06T15:25:49.157 に答える