c ++代码结果输出因执行方法debug vs run而异

时间:2012-09-06 15:16:46

标签: c++ random srand

该程序生成随机字符串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;
}

3 个答案:

答案 0 :(得分:1)

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

使用作为种子传递的参数初始化伪随机数生成器。

对于在srand调用中使用的每个不同的种子值,可以预期伪随机数生成器在随后的rand调用中生成不同的连续结果。 使用相同种子进行两次不同的初始化,指示伪随机生成器为后续调用rand生成相同的连续结果

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

  

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

它在调试中工作的原因是调试足够慢,以便以当前时间(以毫秒为单位)重新初始化srand会产生不同的随机字符串。在发布时,您的代码太快,因此srand正在重新初始化为相同的随机数列表。正如另一个答案建议你应该只调用一次srand。虽然如果你在那里睡了1毫秒就会有趣,但问题就会消失。