随机播放模式的实现

更新

时隔一年,今晚在看《Java编程》一书时,突然发现Java集合类中,Collections类有一个Collections.shuffle()方法(shuffle就是洗牌的意思),可以随机的打乱List,算法思想其实也差不多就是下面所描述的这个过程,有兴趣可以看看shuffle方法的源码。这样的话,也就不需要自己手动的来实现这个过程了。发现提升最快还真是多看看书,自己折腾半天不知其实早是前人玩透了的东西。

前言

播放器大致共有三种播放模式:列表循环、单曲循环、随机播放。前两者不难实现,所以这里主要讲到的是随机播放的思想,也同时附上实现。实现的例子是Winform+WndowsMediaPlayer控件(关于WMP控件的添加方式与使用,在我的其他博客中有写到),程序下载在后边给出。

一、随机播放

1.概念

理想的随机播放模式:在一轮播放中,歌单中所有的歌曲只播放一次,播放次序随机(一轮播放是指,例如播放列表中有10首音乐,每首音乐播放一次,共10次,称为一轮。一轮的概念在之后的实现中有比较重要的作用)。

2.实现思想

通过概念可知我们要实现两点:①只播放一次②次序随机。所以生成一个随机序列,再按序列的值播放歌曲,就可以很好的达到以上两点。好了,主要的实现思想有了,我们再考虑一下细节。

1)随机List怎样生成?

  • 初始化List。需要定义List的长度(播放列表中歌曲的总数),List的初始值(歌曲的序号);
  • 打乱List。实现次序随机排列;
  • 返回List。

2)List怎样打乱?

遍历List,每次随机交换(Swap)List中的两个值。

for (int i = 0; i < List.Count - 1; i++)
{
    //生成随机数
    Random r = new Random(Guid.NewGuid().GetHashCode());
    int j = r.Next(0, List.Count() - 1);

    Swap(List, i, j);
}

由于计算机处理速度非常快,所以如果以时间作种子生成的随机数是相同的。而以Guid的哈希码作为种子值,可以在同一时间下生成不重复的随机数。

二、优化处理

经过以上的步骤,随机序列List我们是有了,但还还需要注意下面这个问题。

1)冲突

在第一轮播放中,用户选中并播放了一首歌,那么这首歌便不能再出现在第一轮的List中;而生成的List是整个歌曲列表的次序。

2)解决

所以生成List的时候,还需要做判断,当前是否是第一轮播放,如果是,remove用户选中的那一首歌,并在列首补位,保持长度,防止访问越界。 
这样才能使得每首歌曲在一轮播放中只播放一次。

三、查看效果

测试效果如下图所示, 
第一轮,用户点击的是第三首歌曲(序号为2),所以2是第一首播放,将-1加入列首占位。 
第二轮,完全按照序列的顺序进行逐一播放。 
测试使用的是1~2秒的提示音,在下载链接中也有包含,可自行使用测试。

随机播放模式的实现_第1张图片

最后

下载链接点击此处

有任何疑问或建议欢迎在下方留言,我会及时回复。

 

你可能感兴趣的:(随机播放模式的实现)