从随机播放算法看 iPod 的细节之美
似乎从数码播放器出现的那一天开始就有了一个功能叫做随机播放,许多朋友都不喜欢按照顺序听歌,而喜欢那种随机的感觉。正如苹果的 iPod Shuffle ,字面意思就是洗牌,而宣称的广告词更是凸显了对这个功能的重视:“Life is random” 。这种你永远不知道下一首歌是什么的感觉,牢牢的抓住了那些喜欢新奇,喜欢惊喜的消费者的心理。但是,随机播放这个功能现在是个播放器都具有,为何单单是苹果的 iPod 却让不少人感觉特别的舒服呢?
不知道大家发现没有,其实随机播放的常见算法分为两种,一种是 iPod 这种的,类似洗牌的方法,我暂且叫它“洗牌”算法。也就是说,当你在播放器中载入一些歌曲后,系统会把这些歌曲放在一个列表里,然后对这个列表进行一种反排序,也就是把次序打乱,和我们平时打牌的时候洗牌一样,这样我们就获得了一个乱序的播放列表,依次播放这个列表就可以实现乱序的播放了。另一种是大部分的播放器具有的,是进行一个随机数的运算。也就是通过随机函数从播放列表中随机抽取一个歌曲进行播放,和抓阄的感觉差不多的方法,这里我叫它为“抓阄”算法。
这里我们不难看出,大部分播放器用的“抓阄”式的算法有个一些比较明显的缺陷:
1、有一定的概率连续选取到一样的曲子。其实这个只要你歌曲比较多的时候还是很少见的,但是由于一般的播放器的随机数的随机性都不是那么的好,往往某几首歌曲会很少很少选中,尤其是靠近首尾的歌曲。 虽然没法看到播放器中的随机数生成的算法,但是我们不难推测,大部分的播放都采用了现在最流行,也是比较快捷的一种算法──线性同余算法,或者就是这种算法的略微修改版本。这种算法在很多地方都普遍应用,比如 C 语言的标准库中就是利用了它产生随机数的。但是这个算法虽然是均匀分布的随机数,但是它是有缺陷的。简单的说,这个算法依赖于你给的随机数的上限,如果上限越小,那重复的概率就会越大。所以在播放器中,受限于整数最大值的关系,重复的概率还是蛮大的。
2、第二种“抓阄”式随机算法还有个很严重的问题,就是当你听了一首歌曲,感觉很爽想再听的时候,你按下上一首,发现随机的跳跃到另外的歌曲去了,相信这个会让很多人很恼火。也就是当这种算法启动之后,你的播放器的“下一首”和“上一首”成为了完全一样的存在。 当然,这还是有办法解决的,比如说设计一个记录表,标记已经播放了的曲子,然后下次就不要选中了,同时记录也可以实现退回上一首歌曲的功能。但是这样就必须让播放器提供额外的空间来储存这些内容,这不得不说是一个不“美”的解决方案。
介于上面两个问题,iPod 使用的“洗牌”式的算法就解决的相对更完美些。我们无法看到算法的本体,所以也无法从传统意义上的时空效率来评价 iPod 的算法,但是单单就是解决了上面两个问题,就足以让用户体验提升不止一个档次。
真正的随机,其实并不讨人喜欢。人们喜欢的,是那种精心安排的偶遇。但是,苹果这种算法,做到了“可以追溯,可以回忆”,就像年华似水,可以溯游而上,倾心追忆,已经很好。毕竟,生活本身就不是把类似旋律的安排在一起,life is random.
写到这里突然想起一句话,越优秀的算法总是越贴近生活。而这种贴近生活的感觉,也许正是组成 iPod 所向披靡的魅力的成分吧。