Napisałem program w C++, który generuje pliki tekstowe - w określonej przez użytkownika ilości. Program zapisuje we wskazanym miejscu pliki, a wszystkie szczegóły wczytywane są z klawiatury.
Jako że plików może być dużo np. 20, 50, 300, 1000 itp. nadawane są im losowe nazwy.
Schemat działania jest prosty - pewna funkcja zawiera dwie tablice stringów i wybiera po jednym losowym elemencie z każdej z nich, dokonuje konkatenacji i zwraca tak powstały napis (nazwę). W programie main do zwracanego przez funkcję napisu doklejany jest id, czyli indywidualny numerek.
MÓJ PROBLEM: Każde uruchomienie programu owocuje identycznymi nazwami plików, pomimo teoretycznej losowości generowania nazw. To skutkuje tym, że jeśli utworzę w folderze 3 pliki, to nie mogę uruchomić programu jeszcze raz i stworzyć tam kolejnych 3 plików, bo nazwy będą takie same jak 3 poprzednich. A nazwy plików w folderze nie mogą się powtarzać.
Do losowości używam mt19937, czyli generatora który inicjalizowany jest w main()
// initialize random number generator
random_device randevice;
mt19937 gen(randevice());
Tak tworzę pliki (tempPath to wartość będąca początkiem ścieżki, powstaje wcześniej w programie i nie mam co do niej zastrzeżeń) wewnątrz main()
// create files on drive
//int quantityOfFiles = amountOfFiles;
fstream * junkFiles = new fstream[amountOfFiles];
for(int i=0; i<amountOfFiles; i++)
{
int id = i;
string path = tempPath + generateName(gen) + to_string(id) + ".txt";
cout << path << endl; // diagnostic cout
junkFiles[i].open(path, ios::out);
}
Funkcja generateName():
// generate individual name for single file
string generateName(mt19937& gen)
{
string names1[10] = {"project", "configuration", "error", "user", "temp", "update", "help", "resource", "template", "plugin"};
string names2[10] = {"_data", "_database", "_log", "_pref", "_module", "_cache", "_backup", "_config", "_addon", "_extender"};
uniform_int_distribution<int> dist(0, 9);
string output;
output = names1[dist(gen)] + names2[dist(gen)];
return output;
}