关于音乐播放器中随机播放的两种模式

时间:2021-01-13 19:13:31

众所周知,一个有完整功能的音乐播放器应该能够让用户自主选择播放模式,例如单曲循环,随机播放,列表循环,全部播放......本文主要讨论其中的随机播放,在实现随机播放的功能可以有两种方法,即random算法和shuffle算法。两者各有利弊,笔者就试着以自己短浅的认识来谈谈这两种算法:(都是JAVA代码)

一.random算法实现随机播放

通过random实现随机播放的优点是能够实现完全随机的播放,即下一首播放出来前谁都不知道将会播放什么,达到完全随机的目的,但是其缺点也会凸显出来,就是上一曲和下一曲其实已经没有任何差异,都是完全随机的(想要上一曲不一样的,就得实现历史记录,这个比较复杂,一般的随机播放就是上一曲和下一曲一样,都是随机的,至于上一曲实现记忆功能下面会说到),这就相当于将上一曲这个按键的功能抹去了,但是这点小牺牲完全可以承受,一般大多数播放器的随机播放都是采用random算法,相信也是有一定的原因的。

废话不多说,上代码:

Calendar ca = Calendar.getInstance();//这个是用来获取系统当前时间的
int i;
Random rand =new Random(ca.get(Calendar.MINUTE)*ca.get(Calendar.SECOND));//将随机数的种子设置为当前系统时间的分*秒,是为了种子不定,随机数不定,该方法不唯一
i=rand.nextInt(maxnum);//maxnum是随机数最大不超过得值
这段代码只是把大概的一个思路,一个方法贴出来,至于要是使用的话可以借鉴思路,还得根据你自己的要求自己更改。

二.shuffle算法实现随机播放

通过shuffle算法实现的随机播放相比random实现的有一个最大的好处就是能够将上一曲按键的功能体现出来,能够实现记忆播放,对于刚接触shuffle算法的人来说一时间难以理解,这个算法到底是干啥的?说个简单的例子估计你就懂了,给你若干数字,让你排序估计你能想到很多算法,比如冒泡排序、插入排序、快速排序.......一大串各种各样的算法来达到要求,那么接下来就容易多了,那就是shuffle算法就是将一串有序的数字变得无序,就是排序的逆算法,一个是将杂乱的变的有序,而另一个则是将有序的变得杂乱无序,这下好理解多了吧,就是搞破坏,就是将有序的变得无序,但是它还是一个特定的序列,对,它还是个序列,既然是序列那么肯定就会有某种必然的规律,有一定的位置,那么上一曲的实现是不是容易多了,但是要考虑到的是越界的问题(即出现第一个元素的上一个,最后一个元素的后一个这种情况),最后说说shuffle算法的缺点吧,那就是相比random算法他不能算的上是完全随机,因为那个杂乱的序列一旦确定就无法改变,剩下的就是按剧本演戏,按部就班。这个算法在好多编程语言里面都提供给开发者了现成的使用方法,一般不需要自己再重写,但是要是不能满足自己的要求的话,就得自己写了,我建议刚开始接触这个算法的人自己写写,会加深对这个算法的理解,下面我提供自己写的,还有就是要避免每次生成的无序序列都是一样的,这样的算法不是一个好的算法,至少对音乐播放器来说。


public void shuffle(int a)

{

int tm[] = new int[a];

int temp,first,next;

for(int i = 0;i<a;i++)

{

tm[i]=i;

}

for(int i = 0;i<a;i++)

{

Calendar ca = Calendar.getInstance();

Random rand =new Random(i+ca.get(Calendar.MINUTE)*ca.get(Calendar.SECOND));

Random rand1 =new Random(rand.nextInt(songnum)); 

first=rand1.nextInt(tm.length); 

temp = tm[i]; 

next=tm[first];  

tm[i]=next;  

tm[first]=temp;

}

}

由于本人水平有限,有说的不对的地方还请斧正。