Эта программа генерирует случайную строку 3 раза
Результат уникален и отличается при отладке в затмении с «шагом в»
Результат — та же самая строка 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;
}
http://cplusplus.com/reference/clibrary/cstdlib/srand/
Генератор псевдослучайных чисел инициализируется с использованием аргумента, переданного в качестве начального числа.Можно ожидать, что для каждого другого начального значения, используемого при обращении к srand, генератор псевдослучайных чисел будет генерировать различную последовательность результатов в последующих вызовах rand.
Две разные инициализации с одним и тем же начальным числом, инструктирует псевдослучайный генератор генерировать одинаковую последовательность результатов для последующих вызовов rand в обоих случаях.
http://cplusplus.com/reference/clibrary/ctime/time/
Получить текущее календарное время как объект time_t.
Это происходит потому, что вы звоните srand
внутри generaterandomstring
, Во время сеанса отладки между итерациями проходит больше времени (более секунды), так что time(NULL)
каждый раз возвращает разные значения. При свободном запуске ваша программа устанавливает случайное начальное значение на одно и то же значение, и вы получаете одно и то же «случайное» значение на каждой итерации.
Причина, по которой он работает в режиме отладки, заключается в том, что отладка происходит достаточно медленно, и ваша повторная инициализация srand с текущим временем в миллисекундах приводит к появлению разных случайных строк. В выпуске ваш код слишком быстрый, поэтому srand переинициализируется в тот же список случайных чисел. Как следует из другого ответа, вам следует звонить srand один раз и только один раз. Хотя, как забавно, если вы бросите спать на 1 миллисекунду, проблема исчезнет.