случайный — вывод результата кода c ++ различен в зависимости от метода выполнения отладки и запуска

Эта программа генерирует случайную строку 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;
}

2

Решение

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


Генератор псевдослучайных чисел инициализируется с использованием аргумента, переданного в качестве начального числа.

Можно ожидать, что для каждого другого начального значения, используемого при обращении к srand, генератор псевдослучайных чисел будет генерировать различную последовательность результатов в последующих вызовах rand.
Две разные инициализации с одним и тем же начальным числом, инструктирует псевдослучайный генератор генерировать одинаковую последовательность результатов для последующих вызовов rand в обоих случаях.

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

Получить текущее календарное время как объект time_t.

1

Другие решения

Это происходит потому, что вы звоните srand внутри generaterandomstring, Во время сеанса отладки между итерациями проходит больше времени (более секунды), так что time(NULL) каждый раз возвращает разные значения. При свободном запуске ваша программа устанавливает случайное начальное значение на одно и то же значение, и вы получаете одно и то же «случайное» значение на каждой итерации.

0

Причина, по которой он работает в режиме отладки, заключается в том, что отладка происходит достаточно медленно, и ваша повторная инициализация srand с текущим временем в миллисекундах приводит к появлению разных случайных строк. В выпуске ваш код слишком быстрый, поэтому srand переинициализируется в тот же список случайных чисел. Как следует из другого ответа, вам следует звонить srand один раз и только один раз. Хотя, как забавно, если вы бросите спать на 1 миллисекунду, проблема исчезнет.

0
По вопросам рекламы [email protected]