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

获取当前路径:

char buf[1000];
GetCurrentDirectory(1000,buf);
string cur_folder_file = string(buf)+"\\*.mp3";

获取当前路径mp3文件列表:

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):

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()失败!

再小小改动一下:

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;
//used_names[i] =false;
}
}
}
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个数交换位置。

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 未经同意请勿用于商业用途)

【C++】随机重命名MP3文件的更多相关文章

  1. shell下批量重命名svn文件的方法

    shell下批量重命名svn文件的方法 目标: 将svn目录下所有文件重命名 , 原文件前缀为 ucc_ , 批量改为 xmd_ 用tree看下当前svn目录 ucc_1.c ucc_1.h ucc_ ...

  2. oracle重命名数据文件

    重命名数据文件   方法1: sql>alter tablespace users offline; sql>host cp /u01/app/oracle/oradata/orcl/us ...

  3. servlet操作本地文件汇总: 判断文件是否存在;文件重命名;文件复制; 获取文件属性信息,转成Json对象; 获取指定类型的文件; 查找替换.txt中的文本

    package servlet; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; ...

  4. Linux中重命名乱码文件

    Linux下,如何将一个乱码的文件进行重命名 方法一: 命令格式:mv $(ls |egrep "[^a-zA-Z0-9.-]") tandao.tx [root@nb o]# l ...

  5. golang结构体排序 - 根据下载时间重命名本地文件

    喜M拉Y下载音频到手机,使用ximalaya.exe 解密[.x2m]为[.m4a]根据文件下载创建时间,顺序重命名文件,方便后续播放. 源码如下:package main import ( &quo ...

  6. Linux文件系统之mv(重命名/移动文件)

    mv(move)命令 输入man mv,了解到mv命令是用于移动或重命名文件 语法 mv [options] source dest mv [options] source... directory ...

  7. node递归批量重命名指定文件夹下的文件

    1.用法:将js内容拷到一文件中,命名为batchRename.js:  该文件可以放到任何你想更改文件名的文件夹目录,然后dos(或 linux 终端)进入该文件夹,然后执行node batchRe ...

  8. Python实现重命名一个文件夹下的图片

    在网上查了一下python实现的图片重命名,工作中刚好用一下. # -*- coding:utf8 -*- import os path = '新建文件夹 (2)/' filelist = os.li ...

  9. python 小工具 重命名当前文件夹内所有的文件,升序命名

    背景:一个朋友想升序重命名他的照片,但是太多了不想手动所以,emememem os这个模块,不用说,rename,filedir等 #conding=utf8 import os path = os. ...

随机推荐

  1. codeforces 675 C ——Money Transfers——————【思维题】

    Money Transfers time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  2. MySQL:ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

    解决方法: 修改密码:alter user 'root'@'localhost' identified by '123456'; mysql> use mysql; ERROR 1820 (HY ...

  3. 一台电脑上运行两个tomcat

    1.建立两个文件夹,tomcat1,tomcat2,分别在里面放入tomcat7文件(非安装版) 2.改配置 tomcat1中的配置就不用改了,直接用默认配置 tomcat2中的配置要改要,改conf ...

  4. js 两个小括号 ()() 的用法

    实现一个函数fn, 使fn(1)(2)的结果为两个参数的和,刚开始没反应过来,其实细细一想第二个括号就是函数再调用的问题,废话不多说,代码奉上: var fn = function(n) { func ...

  5. 如何解决git fatal: refusing to merge unrelated histories

    我在Github新建一个仓库,写了License,然后把本地一个写了很久仓库上传. 先pull,因为两个仓库不同,发现refusing to merge unrelated histories,无法p ...

  6. C# textBox限定输入数字

    private void tBox_KeyPress(object sender, KeyPressEventArgs e) { ; //禁止空格键 )) return; //处理负数 if (e.K ...

  7. Android菜单(动画菜单、360波纹菜单)

     Android菜单(动画菜单.360波纹菜单) 前言:Android菜单常用集合:FragmentTabHost系统菜单.上移式菜单.360波纹菜单.展开式菜单.详解注释,可直接拿来用! 效果:   ...

  8. klee错误汇报二:KLEE的optimize选项的一个困惑

    问题已经提交github:https://github.com/klee/klee/issues/650 在一个对命令行参数进行建模的符号执行过程中,添加optimize选项与不添加optimize选 ...

  9. web项目开发流程

    对于一个web项目,在实际编码之前,有一些通用的步骤来planning a website: 0.Defining the project (predr0->dr0) 对于外部项目,客户一般会发 ...

  10. Linux->Mysql安装调试

    环境准备 mysql下载地址:https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.19-linux-glibc2.12-x86_64.tar ...