生活随笔
收集整理的這篇文章主要介紹了
随机重命名MP3文件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
新置MP3一件,居然沒有隨機播放的功能,坑啊!身為程序媛一枚,自己動手吧~
獲取當前路徑:
[cpp]?view plaincopy
char?buf[1000];?? ????GetCurrentDirectory(1000,buf);??? ????string?cur_folder_file?=?string(buf)+"\\*.mp3";??
獲取當前路徑mp3文件列表:
[cpp]?view plaincopy
void?getMp3Names(string?filepath,vector<string>?&names)?? {?? ????names.clear();?? ????WIN32_FIND_DATA?f;?? ????HANDLE?h?=?FindFirstFile(filepath.c_str()?,?&f);?? ????if(h?!=?INVALID_HANDLE_VALUE)?? ????{?? ????????do?? ????????{?? ????????????names.push_back(f.cFileName);?? ????????}?while(FindNextFile(h,?&f));?? ????}?? ????FindClose(h);????? }??
隨機重命名mp3文件(命名為num.mp3,如5.mp3):
[cpp]?view plaincopy
void?renameMp3Names(vector<string>?&names){?? ????int?mp3_num?=?names.size();?? ????vector<bool>?used_names(mp3_num,false);?? ????srand(time(NULL));???? ????for(int?i=0;i<mp3_num;i++){?? ????????int?new_name_num?=?-1;?? ????????while(new_name_num<0){?? ????????????int?tmp=?rand()%mp3_num;?? ????????????if(!used_names[tmp]){?? ????????????????new_name_num?=?tmp;?? ????????????????used_names[tmp]?=?true;?? ????????????}?? ????????}?? ????????char?char_tmp[100];?? ????????itoa(new_name_num,char_tmp,10);?? ????????string?new_name?=?string(char_tmp)+".mp3";?? ????????if(!_access(names[i].c_str(),0))?? ????????{?? ????????????if(!rename(names[i].c_str(),new_name.c_str()))?? ????????????{?? ????????????????cout<<"RENAME?"<<names[i]<<"?AS:?"<<new_name<<""<<endl;?? ????????????}?? ????????}?? ????}?? ????return?;?? }??
基本可以啦~
不過有一點,這個程序運行第二遍就有問題了,因為所有的文件都變成了 num.mp3,再次隨機重命名的時候就會出現沖突,重名文件存在導致rename()失敗!
再小小修改一下:
[cpp]?view plaincopy
void?renameMp3Names(vector<string>?&names){?? ????cout<<"---------------RENAME?MP3?FILES---------------"<<endl;?? ????int?mp3_num?=?names.size();?? ????vector<bool>?used_names(mp3_num,false);?? ????srand(time(NULL));???? ????for(int?i=0;i<mp3_num;i++){?? ????????int?new_name_num?=?-1;?? ????????while(new_name_num<0){?? ????????????int?tmp=?rand()%mp3_num;?? ????????????if(!used_names[tmp]){?? ????????????????new_name_num?=?tmp;?? ????????????????used_names[tmp]?=?true;?? ????????????}?? ????????}?? ????????char?char_tmp[100];?? ????????itoa(new_name_num,char_tmp,10);?? ????????string?new_name?=?string("tmp")+string(char_tmp)+".mp3";?? ????????if(!_access(names[i].c_str(),0))?? ????????{?? ????????????if(!rename(names[i].c_str(),new_name.c_str()))?? ????????????{?? ????????????????cout<<"RENAME?"<<names[i]<<"?AS:?"<<new_name<<""<<endl;?? ????????????????names[i]?=?new_name;?? ?????????????????? ????????????}?? ????????}?? ????}?? ????for(int?i=0;i<mp3_num;i++)?? ????????used_names[i]?=?false;?? ????cout<<endl;?? ????cout<<"-------------AGAIN?RENAME?MP3?FILES-------------"<<endl;?? ????for(int?i=0;i<mp3_num;i++){?? ????????int?new_name_num?=?-1;?? ????????while(new_name_num<0){?? ????????????int?tmp=?rand()%mp3_num;?? ????????????if(!used_names[tmp]){?? ????????????????new_name_num?=?tmp;?? ????????????????used_names[tmp]?=?true;?? ????????????}?? ????????}?? ????????char?char_tmp[100];?? ????????itoa(new_name_num,char_tmp,10);?? ????????string?new_name?=?string(char_tmp)+".mp3";?? ????????if(!_access(names[i].c_str(),0))?? ????????{?? ????????????if(!rename(names[i].c_str(),new_name.c_str()))?? ????????????{?? ????????????????cout<<"RENAME?"<<names[i]<<"?AS:?"<<new_name<<""<<endl;?? ????????????}?? ????????}?? ????}?? ????cout<<endl;?? ????return?;?? }??
大功告成啦!
*有關生成隨機序列的修改
多謝一樓友鄰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 plaincopy
void?generateRandomList(vector<int>?&?rand_list){?? ????int?rand_size?=?rand_list.size();?? ????for(int?i=0;i<rand_size;i++){?? ????????rand_list[i]?=?i;?? ????}?? ????srand(time(NULL));??? ????for(int?i=0;i<rand_size;i++){?? ????????int?tmp_rand=?rand()%(rand_size-i);?? ????????int?tmp?=?rand_list[tmp_rand];?? ????????rand_list[tmp_rand]?=?rand_list[rand_size-1-i];?? ????????rand_list[rand_size-1-i]?=?tmp;?? ????}?? ????return;?? }??
這次只需要隨機N次就可以生成不重復的隨機序列啦~
(轉載請注明作者和出處:http://blog.csdn.net/xiaowei_cqu?未經允許請勿用于商業用途)
總結
以上是生活随笔為你收集整理的随机重命名MP3文件的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。