Я сохранил длинный список имен из файла .txt в векторе с именем BunnyNames, и я пытаюсь найти способ случайной генерации элементов (имен) из указанного вектора. Пока что все, что он делает, это печатает имена последовательно из файла .txt, а не в произвольном порядке, как я хочу. Вот мой код:
int main()
{
using namespace std;
string name;
vector<string> BunnyNames;
ifstream myfile("names.txt");
if(!myfile)
{
cerr <<"Error opening output file"<< endl;
system("pause");
return -1;
}
while (getline(myfile, name))
{
BunnyNames.push_back(name);
}
srand (time(0));
int randomIndex = rand() % BunnyNames.size();
std::cout<<BunnyNames[randomIndex]<<std::endl;
return 0;
}
Я хочу, чтобы он печатал только одно имя за раз, но я хочу, чтобы это имя было случайным.
Вот первые несколько строк файла:
Abracadabra
Ace
Akeeta
Учитывая, что вы хотите получить произвольный доступ к векторным элементам, это может быть связано с тем, что вы устанавливаете начальное число внутри цикла.
Попробуйте посеять только один в начале и используйте rand() % BunnyNames.size()
внутри цикла как:
srand (time(0));
while(condition)
{
int randomIndex = rand() % BunnyNames.size();
}
Другим случаем может быть то, что цикл повторяется достаточно быстро, чтобы в последовательных итерациях время не менялось, создавая одинаковые значения.
Спасибо всем за помощь. Оказывается, на самом деле это были распечатки случайных имен, но я не уловил их, потому что имена все еще шли в алфавитном порядке. Я не осознавал, что он пропускал группы имен одновременно, в зависимости от того, сколько времени прошло, прежде чем я перезапустил программу (так как srand (time (0)) основан на времени).
Проблема в том, что если вы запускаете программу несколько раз подряд, вы используете одни и те же или очень похожие начальные числа (потому что время не сильно меняется). Вам нужно найти способ генерировать совершенно разные начальные числа при каждом запуске программы или создавать генератор случайных чисел, в котором вы можете сохранить состояние. Например, вы можете сделать это:
unsigned int seed = time(0);
std::ifstream fin("rand.txt");
if (fin)
{
fin >> seed;
fin.close();
}
srand(seed);
seed = rand();
unsigned int randomIndex = seed % BunnyNames.size();
std::ofstream fout("rand.txt");
fout << seed;
Он сохраняет сгенерированное число из предыдущего запуска программы в файл, а затем использует это значение для начального числа при следующем запуске.