text — Как выбрать случайный элемент из вектора, заполненного .txt именами файлов Переполнение стека

Я сохранил длинный список имен из файла .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

0

Решение

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

Попробуйте посеять только один в начале и используйте rand() % BunnyNames.size() внутри цикла как:

srand (time(0));
while(condition)
{
int randomIndex = rand() % BunnyNames.size();
}

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

2

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

Спасибо всем за помощь. Оказывается, на самом деле это были распечатки случайных имен, но я не уловил их, потому что имена все еще шли в алфавитном порядке. Я не осознавал, что он пропускал группы имен одновременно, в зависимости от того, сколько времени прошло, прежде чем я перезапустил программу (так как srand (time (0)) основан на времени).

1

Проблема в том, что если вы запускаете программу несколько раз подряд, вы используете одни и те же или очень похожие начальные числа (потому что время не сильно меняется). Вам нужно найти способ генерировать совершенно разные начальные числа при каждом запуске программы или создавать генератор случайных чисел, в котором вы можете сохранить состояние. Например, вы можете сделать это:

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;

Он сохраняет сгенерированное число из предыдущего запуска программы в файл, а затем использует это значение для начального числа при следующем запуске.

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