Подобным образом произвольно выбирая файл таким образом, можно сделать, используя метод отбор проб из резервуара . Для каждого файла выберите его с вероятностью 1 / N, где N - это количество найденных вами файлов, включая только что найденный файл. Случайный файл является последним файлом, выбранным таким образом.
См. Также этот вопрос для аналогичной задачи выбора случайной строки из текстового файла;Отбор проб резервуара применяется, как правило, всякий раз, когда количество элементов для выбора заранее неизвестно.
Ниже объясняется, как работает отбор проб резервуара:
- Установите N в1.
- Установите для ChosenFile значение NULL.
- Для каждого файла:
- Если
random::uniform() < 1.0 / N
, установите для ChosenFile имя файла. - Добавьте 1 кN.
Теперь, ChosenFile - это произвольно выбранное имя файла.
Взяв код в вашем вопросе, вот как может быть произведена выборка из резервуарареализованы. Обратите внимание, что в списке больше нет файлов. Также обратите внимание, что этот код не проверен.
// store randomly chosen file
std::string path;
size_t n = 1;
for (const auto &entry: std::filesystem::recursive_directory_iterator(mPathDirectory)) {
if (!std::filesystem::is_directory(entry)) {
if (random::uniform() < 1.0 / n) {
path = entry.path().string();
}
n++;
}
}
return path;