新置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. Hackers top in China

    黑客,英文hacker.精通计算机各类技术的计算机高手,泛指擅长IT技术的人群.计算机科学家. 最近受某机构所托搜集国内活跃黑客近况.本着客观专业,权威可信的原则参考了国内从00年到最新的黑客榜单,以 ...

  2. JVM(二) 对象存活判断和垃圾回收算法

    对象的创建 概述 下面简要介绍创建对象的几个重要步骤 : 检查能否在常量池定位到一个类的符号引用,并检查这个符号代表的类是否已被加载,解析和初始化过.如果没有则执行类加载的操作.(即是说对象的引用放在 ...

  3. java 的数据库操作--JDBC

    一.java与数据库的交互 1.jdbc:java data base connectivity,java数据库连接.java的JDBC操作主要通过操作两个类进行连接操作:Connection 和 S ...

  4. 同步ajax请求

    /* * 发送同步ajax请求的函数 CreateBy 秋水 */ function syncAjax(data) { var resp = null; $.ajax({ type : "P ...

  5. pom文件解析

    Maven的依赖是使用Maven坐标来定位的,而Maven坐标主要由GAV(groupId, artifactId, version)构成.因此,使用任何一个依赖之间,你都需要知道它的Maven坐标. ...

  6. javaScript 面向对象开发实例

    javaScript 面向对象开发实例 这个是结合require的模块化开发,首先创建构造函数: //test.js 1 function Test(lists) { var config={ nam ...

  7. 关于moucedown 的3种触发方式

    与 click 事件不同   mousedown 按下鼠标就可以触发 click 只能用鼠标左键触发, 而mousedown 可以由单击.中键.或右击 触发 根据对event.which 的判断,可以 ...

  8. Excellent JD

    Job description About the role We are looking for a talented engineer who has excellent cloud skills ...

  9. Fundmentals in Stream Computing

    Spark programs are structured on RDDs: they invole reading data from stable storage into the RDD for ...

  10. C++中 set(集合容器)的用法

    set集合容器: 实现了红黑树(Red-Black Tree)的平衡二叉检索树的数据结构,在插入元素时, 它会自动调整二叉树的排列,把该元素放到适当的位置,以确保每个子树根节点的键值大于左子树所有节点 ...