# 从随机播放算法看 iPod 的细节之美

- 作者：zerob13
- 发布时间：2011-01-05 07:00
- 分类：公司
- 原文：https://www.ifanr.com/29498

[![](https://s3.ifanr.com/wp-content/uploads/2011/01/shuffle-logo-curves-360x180.jpg "shuffle-logo-curves")](http://www.ifanr.com/29498/shuffle-logo-curves)

似乎从数码播放器出现的那一天开始就有了一个功能叫做随机播放，许多朋友都不喜欢按照顺序听歌，而喜欢那种随机的感觉。正如苹果的 iPod Shuffle ，字面意思就是洗牌，而宣称的广告词更是凸显了对这个功能的重视：“Life is random” 。这种你永远不知道下一首歌是什么的感觉，牢牢的抓住了那些喜欢新奇，喜欢惊喜的消费者的心理。但是，随机播放这个功能现在是个播放器都具有，为何单单是苹果的 iPod 却让不少人感觉特别的舒服呢？

不知道大家发现没有，其实随机播放的常见算法分为两种，一种是 iPod 这种的，类似洗牌的方法,我暂且叫它“洗牌”算法。也就是说，当你在播放器中载入一些歌曲后，系统会把这些歌曲放在一个列表里，然后对这个列表进行一种反排序，也就是把次序打乱，和我们平时打牌的时候洗牌一样，这样我们就获得了一个乱序的播放列表，依次播放这个列表就可以实现乱序的播放了。另一种是大部分的播放器具有的，是进行一个随机数的运算。也就是通过随机函数从播放列表中随机抽取一个歌曲进行播放，和抓阄的感觉差不多的方法，这里我叫它为“抓阄”算法。

这里我们不难看出，大部分播放器用的“抓阄”式的算法有个一些比较明显的缺陷：

1、有一定的概率连续选取到一样的曲子。其实这个只要你歌曲比较多的时候还是很少见的，但是由于一般的播放器的随机数的随机性都不是那么的好，往往某几首歌曲会很少很少选中，尤其是靠近首尾的歌曲。 虽然没法看到播放器中的随机数生成的算法，但是我们不难推测，大部分的播放都采用了现在最流行，也是比较快捷的一种算法──线性同余算法，或者就是这种算法的略微修改版本。这种算法在很多地方都普遍应用，比如 C 语言的标准库中就是利用了它产生随机数的。但是这个算法虽然是均匀分布的随机数，但是它是有缺陷的。简单的说，这个算法依赖于你给的随机数的上限，如果上限越小，那重复的概率就会越大。所以在播放器中，受限于整数最大值的关系，重复的概率还是蛮大的。

2、第二种“抓阄”式随机算法还有个很严重的问题，就是当你听了一首歌曲，感觉很爽想再听的时候，你按下上一首，发现随机的跳跃到另外的歌曲去了，相信这个会让很多人很恼火。也就是当这种算法启动之后，你的播放器的“下一首”和“上一首”成为了完全一样的存在。 当然，这还是有办法解决的，比如说设计一个记录表，标记已经播放了的曲子，然后下次就不要选中了，同时记录也可以实现退回上一首歌曲的功能。但是这样就必须让播放器提供额外的空间来储存这些内容，这不得不说是一个不“美”的解决方案。

介于上面两个问题，iPod 使用的“洗牌”式的算法就解决的相对更完美些。我们无法看到算法的本体，所以也无法从传统意义上的时空效率来评价 iPod 的算法，但是单单就是解决了上面两个问题，就足以让用户体验提升不止一个档次。

真正的随机，其实并不讨人喜欢。人们喜欢的，是那种精心安排的偶遇。但是，苹果这种算法，做到了“可以追溯，可以回忆”，就像年华似水，可以溯游而上，倾心追忆，已经很好。毕竟，生活本身就不是把类似旋律的安排在一起，life is random.

写到这里突然想起一句话，越优秀的算法总是越贴近生活。而这种贴近生活的感觉，也许正是组成 iPod 所向披靡的魅力的成分吧。
