2

该程序生成随机字符串 3 次

当在 Eclipse 中使用“step into”进行调试时,结果是唯一且不同的

刚执行时结果是相同的字符串 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 时生成不同的连续结果。 使用相同种子的两个不同初始化指示伪随机生成器在两种情况下为随后对 rand 的调用生成相同的连续结果

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

获取当前日历时间作为 time_t 对象。

于 2012-09-06T15:21:13.087 回答
0

发生这种情况是因为您调用srand inside generaterandomstring。在调试会话期间,迭代之间有足够的时间(超过一秒),因此time(NULL)每次返回不同的值。在自由运行时,您的程序将随机种子设置为相同的值,并且每次迭代都会获得相同的“随机”值。

于 2012-09-06T15:25:44.040 回答
0

它在调试中起作用的原因是调试速度很慢,以至于您以毫秒为单位重新初始化 srand 会产生不同的随机字符串。在发布时,您的代码太快了,因此 srand 被重新初始化为相同的随机数列表。正如另一个答案所建议的那样,您应该只调用一次 srand 。虽然有趣的是,如果你在那里睡眠 1 毫秒,问题就会消失。

于 2012-09-06T15:25:49.157 回答