随机重命名MP3文件

新置MP3一件,居然没有随机播放的功能,坑啊!身为程序媛一枚,自己动手吧~

获取当前路径:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. char buf[1000];  
  2.     GetCurrentDirectory(1000,buf);   
  3.     string cur_folder_file = string(buf)+"\\*.mp3";  
获取当前路径mp3文件列表:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void getMp3Names(string filepath,vector<string> &names)  
  2. {  
  3.     names.clear();  
  4.     WIN32_FIND_DATA f;  
  5.     HANDLE h = FindFirstFile(filepath.c_str() , &f);  
  6.     if(h != INVALID_HANDLE_VALUE)  
  7.     {  
  8.         do  
  9.         {  
  10.             names.push_back(f.cFileName);  
  11.         } while(FindNextFile(h, &f));  
  12.     }  
  13.     FindClose(h);     
  14. }  
随机重命名mp3文件(命名为num.mp3,如5.mp3):

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void renameMp3Names(vector<string> &names){  
  2.     int mp3_num = names.size();  
  3.     vector<bool> used_names(mp3_num,false);  
  4.     srand(time(NULL));    
  5.     for(int i=0;i<mp3_num;i++){  
  6.         int new_name_num = -1;  
  7.         while(new_name_num<0){  
  8.             int tmp= rand()%mp3_num;  
  9.             if(!used_names[tmp]){  
  10.                 new_name_num = tmp;  
  11.                 used_names[tmp] = true;  
  12.             }  
  13.         }  
  14.         char char_tmp[100];  
  15.         itoa(new_name_num,char_tmp,10);  
  16.         string new_name = string(char_tmp)+".mp3";  
  17.         if(!_access(names[i].c_str(),0))  
  18.         {  
  19.             if(!rename(names[i].c_str(),new_name.c_str()))  
  20.             {  
  21.                 cout<<"RENAME "<<names[i]<<" AS: "<<new_name<<""<<endl;  
  22.             }  
  23.         }  
  24.     }  
  25.     return ;  
  26. }  

基本可以啦~


不过有一点,这个程序运行第二遍就有问题了,因为所有的文件都变成了 num.mp3,再次随机重命名的时候就会出现冲突,重名文件存在导致rename()失败!

再小小修改一下:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void renameMp3Names(vector<string> &names){  
  2.     cout<<"---------------RENAME MP3 FILES---------------"<<endl;  
  3.     int mp3_num = names.size();  
  4.     vector<bool> used_names(mp3_num,false);  
  5.     srand(time(NULL));    
  6.     for(int i=0;i<mp3_num;i++){  
  7.         int new_name_num = -1;  
  8.         while(new_name_num<0){  
  9.             int tmp= rand()%mp3_num;  
  10.             if(!used_names[tmp]){  
  11.                 new_name_num = tmp;  
  12.                 used_names[tmp] = true;  
  13.             }  
  14.         }  
  15.         char char_tmp[100];  
  16.         itoa(new_name_num,char_tmp,10);  
  17.         string new_name = string("tmp")+string(char_tmp)+".mp3";  
  18.         if(!_access(names[i].c_str(),0))  
  19.         {  
  20.             if(!rename(names[i].c_str(),new_name.c_str()))  
  21.             {  
  22.                 cout<<"RENAME "<<names[i]<<" AS: "<<new_name<<""<<endl;  
  23.                 names[i] = new_name;  
  24.                 //used_names[i] =false;  
  25.             }  
  26.         }  
  27.     }  
  28.     for(int i=0;i<mp3_num;i++)  
  29.         used_names[i] = false;  
  30.     cout<<endl;  
  31.     cout<<"-------------AGAIN RENAME MP3 FILES-------------"<<endl;  
  32.     for(int i=0;i<mp3_num;i++){  
  33.         int new_name_num = -1;  
  34.         while(new_name_num<0){  
  35.             int tmp= rand()%mp3_num;  
  36.             if(!used_names[tmp]){  
  37.                 new_name_num = tmp;  
  38.                 used_names[tmp] = true;  
  39.             }  
  40.         }  
  41.         char char_tmp[100];  
  42.         itoa(new_name_num,char_tmp,10);  
  43.         string new_name = string(char_tmp)+".mp3";  
  44.         if(!_access(names[i].c_str(),0))  
  45.         {  
  46.             if(!rename(names[i].c_str(),new_name.c_str()))  
  47.             {  
  48.                 cout<<"RENAME "<<names[i]<<" AS: "<<new_name<<""<<endl;  
  49.             }  
  50.         }  
  51.     }  
  52.     cout<<endl;  
  53.     return ;  
  54. }  



大功告成啦!

*有关生成随机序列的修改

多谢一楼友邻xiucaijiang 的留言,指出来上述方法生成随机序列的效率很低。确实,上面用的方法是初始化一个序列用来记录已经“用过”的数,如果生成的随机数是已经用过的数,那么就再重新生成一遍。这样的方法对于生成大小为N的随机序列,生成第一个随机数的期望次数为1次,第二次为N/(N-1)次,第三次为N/(N-2)次,最后一个数期望次数为N次效率确实很低。xiucaijiang 给出的方法很好:


可以这样理解这种方法:生成随机序列相当于把之前0~N-1排序的N个数随机排列,那么每次我们随机抽出一个来排到后面。也就是第一次在所有N个数里随机抽一个排到最后一位,第二次在前N-1个数里随机抽一个排到倒数第二位,依次类推。由于每次排序每个数被抽到的概率都是1/N,所以可以认为最终的序列是随机排的。

不过这种方法在实现起来需要做几次不必要的位移,比如上面的例子中,第二次假设抽到了2,由0,1,2,3,5,4变成0,1,3,5,2,4需要把3移到第2位,5移到第三位,2换到第四位。这里3和5的移位其实是不必要的。也就是我们下一次在4个数里随机取,前4个数排列成0,1,3,5还是0,1,5,3是不影响的。所以只需要把2和5换位置即可。

总结生成随机序列的方法:循环N次,第i(i=0~N-1)次的操作为在前N-i个数中随机选一个数与第N-i-1个数交换位置。

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void generateRandomList(vector<int> & rand_list){  
  2.     int rand_size = rand_list.size();  
  3.     for(int i=0;i<rand_size;i++){  
  4.         rand_list[i] = i;  
  5.     }  
  6.     srand(time(NULL));   
  7.     for(int i=0;i<rand_size;i++){  
  8.         int tmp_rand= rand()%(rand_size-i);  
  9.         int tmp = rand_list[tmp_rand];  
  10.         rand_list[tmp_rand] = rand_list[rand_size-1-i];  
  11.         rand_list[rand_size-1-i] = tmp;  
  12.     }  
  13.     return;  
  14. }  

这次只需要随机N次就可以生成不重复的随机序列啦~

(转载请注明作者和出处:http://blog.csdn.net/xiaowei_cqu 未经允许请勿用于商业用途)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值