Используйте FindFirstFile
и FindNextFile
в цикле.Ведите счет того, сколько файлов вы уже видели (n
).В каждом цикле случайным образом вспыхивают с вероятностью 1:n
:
if(INVALID_HANDLE_VALUE!=(hFind = FindFirstFile(DirSpec, &FindFileData))) {
for(i=0;;++i) {
strcpy(fileChoice, FindFileData.cFileName);
while(rand_s(&r));
if( ((double)r) / ((double)i) < 1.0 ) break;
if(!FindNextFile(hFind, &FindFileData)) break;
}
}
Вы можете найти доказательство этого метода в книге «Искусство компьютерного программирования», том 2, раздел 3.4.2, Дональда Э.Кнут.