新置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. online contest

    http://atcoder.jp/contest https://nanti.jisuanke.com/contest http://codeforces.com/ https://www.nowc ...

  2. springboot jpa 多条件查询(单表)

    需要实现的功能: 多个搜索输入框:全部不填,则查出所有列表:填了条件,就按条件查找:填的条件个数不定. 方法实现的核心:jpa自带的Specification<T> (目前只需要单表,多表 ...

  3. linux免密登录ssh验证配置方法及常见错误解决

    目标:从服务器A免密登录服务器B [配置方法] 1.在服务器A生成密钥文件,直接使用以下命令: ssh-keygen 中间遇到输入内容一路回车即可,完成后会在 ~/.ssh 目录下生成两个文件:id_ ...

  4. ASP.NET MVC4 新手入门教程之三 ---3.添加视图

    在这一节你要修改HelloWorldController类要使用的视图模板文件来干净封装生成 HTML 响应到客户端的过程. 您将创建一个使用Razor 视图引擎介绍 ASP.NET MVC 3 的视 ...

  5. [转]字符编码笔记:ASCII,Unicode 和 UTF-8

      本文非原创,转载 ,原文地址 :http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html 作者: 阮一峰 日期: 20 ...

  6. Nginx 504错误总结

    Nginx 504错误(Gateway time-out  网关超时)的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI. 一般看来, 这种情况可能是由于nginx默认的f ...

  7. 搭建Jquery+SpringMVC+Spring+Hibernate+MySQL平台

    一. 开发环境 1. 点击此查看并下载需要的 Eclipse IDE for Java EE Developers 开发工具,依赖于java,推荐选用32位   2. 点击此查看并下载需要的 MySQ ...

  8. Iphone各个型号机型的详细参数,尺寸和dpr以及像素

    1.iPhone尺寸规格 2.单位inch(英吋) 1 inch = 2.54cm = 25.4mm 3.iPhone手机宽高 上表中的宽高(width/height)为手机的物理尺寸,包括显示屏和边 ...

  9. 第8章 CSS3中的变形与动画(上)

    变形--旋转 rotate() 旋转rotate()函数通过指定的角度参数使元素相对原点进行旋转.它主要在二维空间内进行操作,设置一个角度值,用来指定旋转的幅度.如果这个值为正值,元素相对原点中心顺时 ...

  10. RocketMQ读书笔记2——生产者

    [生产者的不同写入策略] 生产者向消息队列里写入数据,不同的业务需要生产者采用不同的写入策略: 同步发送.异步发送.延迟发送.发送事务消息等. [DefaultMQProduce示例] public ...