该程序生成随机字符串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;
}
答案 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毫秒就会有趣,但问题就会消失。