音乐随机播放算法
来源:互联网 发布:论坛域名购买 编辑:程序博客网 时间:2024/05/17 23:09
最近做的项目是个跟音乐相关的App,里面涉及到音乐随机播放。看到这篇文章,写得不错,便转了过来。
本文转自http://blog.csdn.net/asce1885/article/details/7582735
常见的音乐随机播放算法主要有两种:一是Shuffle算法;二是Random算法。
一 Shuffle算法
Shuffle算法和排序算法正好相反,是从有序到乱序的一个过程,俗称洗牌算法。它将播放列表中的歌曲顺序打乱,变成一个和原来歌曲顺序没有任何关系的乱序的播放列表,之后进行歌曲的播放,并支持当用户点击“上一首”时,能够回到刚刚播放的那一首歌曲。
二 Random算法
Random算法是在选取即将播放的歌曲时,进行一个随机数的运算,得到即将播放的歌曲在播放列表中的索引,播放列表本身并没有被打乱,只是利用随机函数从播放列表中选取一首歌曲进行播放而已。
现在比较普遍的随机数生成算法是基于线性同余算法实现的,例如C语言标准库函数rand()就是利用它产生随机数的。线性同余算法能够产生均匀分布的随机数,但是它依赖于给定的随机数的上限,如果上限越小,产生的随机数重复的概率就越大。
Random算法另一个缺陷是当点击“上一首”时,跟“下一首”功能完全一样,都是重新生成随机数,并利用它从播放列表中选取歌曲进行播放,而不会回到刚刚播放的那一首歌。当然,这个缺陷可以通过提供历史记录来弥补,只是需要花费额外的空间。
三 随机函数
上面两种算法的关键都是随机函数,下面介绍Java和C两种语言中随机函数的使用。
3.1)Java中的随机函数
Java是采用线性同余算法产生随机数的,优点是随机性好,周期长,速度快,易于计算机软件实现,缺点是产生的随机数受数学规律的制约,具有周期性和相关性,只能产生伪随机序列。JDK提供的随机数生成方式有两种:
3.1.1)Math.random()函数
该函数返回0到1区间中的某个double值,源码实现如下:
可见,该函数底层是调用Random类实现的,首次调用random函数时,静态成员变量randomNumberGenerator为空,因此将调用Random类的构造函数进行初始化,随后每次调用random函数randomNumberGenerator不再为空,将不会再实例化Random类,因此,每次调用Math.random()函数用到的都是同一个种子,也就是首次调用的系统时间产生的种子。3.1.2)Random类
位于Java.util包中,该类有两个构造函数,实现如下:
可见,构造函数默认使用当前的系统时间产生种子,用于初始化Random对象。之后就可以调用各种next*函数来获取各种类型的随机数,如nextBytes,nextInt,nextDouble,nextGaussian等等。
3.2)C/C++中的随机函数
C/C++中最常用的生成伪随机数的方法是C标准库提供的rand()函数,它定义在stdlib.h文件中,能够返回0~RAND_MAX之间均匀分布的伪随机数(RAND_MAX至少为32767,一般默认为32767)。
直接调用rand(),每次生成的伪随机序列是相同的,因为rand()在生成随机数时会使用一个种子(默认值是1),作为计算随机数的初始值,如果种子相同,那么生成的伪随机序列也将是一样的。解决的办法很简单,就是每次使用不同的种子来调用rand()函数,srand()函数就是用来设置rand()函数产生随机数时使用的种子的。
srand()函数原型如下:
srand()和rand()配合使用的示例如下:
需要注意的一点是,上面代码在生成多个随机数时,要将srand()放到for循环的外面,否则上面输出的10个随机数都将是一样的,因为计算机运行速度太快,导致time()函数执行的结果没来得及改变。详见下图。
四 音乐随机播放算法的Shuffle实现
4.1)C/C++版本
4.2)Java版本
五 现成的Shuffle库算法
其实无论在C++还是Java中,都已经实现了Shuffle算法,在实际项目开发中,如果不是有特殊要求的话,完全没有必要自己去实现Shuffle算法,下面就来看看已有的Shuffle算法。
5.1)C++中的Shuffle算法
C++ STL中的函数random_shuffle()就是用来对一个元素序列进行随机重新排序的算法,函数原型如下:
具体用法可参见:http://blog.csdn.net/ACE1985/article/details/5868682 。
5.2)Java中的Shuffle算法
Collections类中实现了Shuffle算法,这个类位于java.util包中,有两个重载函数,下面直接看源码:
参考文献:
1)http://www.ifanr.com/29498 从随机播放算法看iPod的细节之美
2)http://blog.csdn.net/cstn_kdlx/article/details/7326516 随机数生成问题小结
3)http://blog.csdn.net/hcy0727/article/details/7581671 洗牌算法
4)http://blog.csdn.net/chosen0ne/article/details/6129315 随机播放CD
5)http://blog.csdn.net/ACE1985/article/details/5868682 random_shuffle()和transform算法
- 音乐随机播放算法
- 音乐随机播放算法
- 音乐随机播放算法
- 音乐播放随机算法
- 音乐随机播放算法
- 音乐随机播放算法
- 随机音乐播放的算法
- 音乐的随机播放
- 一种基于喜爱程度的音乐随机播放算法
- 随机播放音乐的代码
- Unity 摇一摇震动并随机播放音乐
- Python随机播放电脑里的音乐
- 【腾讯校招】随机音乐播放
- 算法与数据结构——算法题 29:随机播放音乐(腾讯校招) ? 待解决
- 音乐播放器--简单实现播放、暂停、随机播放、音乐进度条(第一版)
- 关于随机播放的算法
- Swift基础之音乐播放随机变换着色板
- Win10开机“提示语音”以及”随机播放音乐”
- Collections
- linux内核哈希链表解析
- 第六章 背景
- for in语句对数组进行遍历
- 为什么说多用组合,少用继承?
- 音乐随机播放算法
- 【TomoEngine】 第七讲 【MOBA制作日记二】 角色攻击
- c语言函数调用栈的变化
- [dp+记忆化搜索]uva10626
- MySQL相关学习资料分享
- 使用xib作为应用入口
- 文本挖掘--LTP-cloud 分词
- Remove Duplicates from Sorted Array
- 心浮气躁(2016-02-26)