C 如何从文件夹中随机选择文件?

C 如何从文件夹中随机选择文件?,c,file,C,File,我有一个c:\config文件夹,其中包含几个配置文件config\u x。 我想能够选择其中一个随机的程序是用C写的。 文件的数量将来可能会发生变化,因此需要能够查询文件夹中的文件数量 怎样才能做到呢 使用FindFirstFile和FindNextFile构建文件夹中文件的列表 生成一个介于0和文件数之间的随机数,然后从列表中选择该索引 MSDN有。在循环中使用FindFirstFile和FindNext文件。记下到目前为止您已看到的文件数量n。在每个循环中,以1:n的几率随机进行: 您可以

我有一个c:\config文件夹,其中包含几个配置文件config\u x。 我想能够选择其中一个随机的程序是用C写的。 文件的数量将来可能会发生变化,因此需要能够查询文件夹中的文件数量

怎样才能做到呢

使用FindFirstFile和FindNextFile构建文件夹中文件的列表 生成一个介于0和文件数之间的随机数,然后从列表中选择该索引 MSDN有。

在循环中使用FindFirstFile和FindNext文件。记下到目前为止您已看到的文件数量n。在每个循环中,以1:n的几率随机进行:


您可以在Donald E.Knuth编写的《计算机编程艺术》第2卷第3.4.2节中找到这种方法的证明。

检查您以前的问题,并在您的问题的最佳答案上打绿色勾。谢谢!将立即执行此操作:@aaaa:使用上面的示例,您可以放置int counter=rand和FindNextFile作为计数器的次数,然后中断循环。@KMån是的,但是如果文件少于计数器,您该怎么办?如果您总是选择最后一个文件,那么您很有可能比其他文件更频繁地选择它。@geocar,确实如此。也许一个综合解决方案是最好的。选择一个随机数,看看文件数是否较小,如果较小,请选择另一个随机数。这很慢。我的答案使用固定的内存量,并且在不到一次通过文件列表的过程中获得正确的答案。
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;
    }
}