当你按下「随机播放」时,QQ 音乐和网易云们都做了什么?
itomcoil 2025-05-23 17:46 4 浏览
下班了,又一次走进熟悉的地铁站,听着已经听过无数遍哐当哐当的地铁轨道声,你突然觉得每天的日子有点乏味和单调,就像太阳每天从东边升起,又从西边落下。
戴上耳机,打开你最喜欢的歌单,就像往常那样。你点下随机播放的按钮,希望把掌控权交给播放器和算法,让它们带给你一点未知的新鲜。
你有没有想过,随机播放算法究竟是如何给我们呈现一个随机歌单的?
「真随机」还是「伪随机」
历史上最经典的随机音乐播放器,应该还要数 iPod Shuffle。
2005 年的时候,苹果公司推出了经典的 iPod Shuffle,iPod Shuffle 在当时来说可以算是一个异类,那时候的音乐播放器(还在直接叫 MP3 的时代)基本上都已经有了一块用来显示音乐信息的屏幕,用户可以自由的选择自己喜欢的音乐,甚至有些 MP3 还能播放视频,比如 2006 年没魅族推出的 miniplayer M6 已经搭载了 2.4 英寸显示屏。
而 iPod Shuffle 没有屏幕,整体比起苹果自家的 iPad Nano 来说也来的简陋。但最大的问题是,用户如何选择自己喜欢的歌曲?
答案是随机列表,你可以通过 iTunes 同步你喜欢的音乐,也可以直接同步一个你喜欢的播放列表,但是在 iPod Shuffle 上,你所能获取的最大感受是「随机播放的魅力」。
实际上,我们所说的「随机播放」常见的方式有两种,一种叫「Shuffle」,一种叫「Random」。
▲ 洗牌算法。图片来自:9to5Mac
Shuffle 一般叫做「洗牌算法」,它的原理是像扑克洗牌一样,将不同数量的扑克牌进行随机排列就能得到一个乱序的顺序。随机播放歌单也是如此,每次播放的时候会将这个列表中的歌曲进行洗牌,从而获得一个乱序的播放,也就是「伪随机」算法。
而 Random 则是真正的随机播放,也就是说每次切换音乐都是独立的未知数,会随机到不同的音乐,就像「抓阄」一样,它没有列表的概念,所以没有上一首和下一首的概念,是「真随机」算法。
怎么判断是「真随机」还是「伪随机」,其实只要按下「上一首」就知道了,如果切换到是你刚才听过的那一首,那就是「伪随机」的洗牌算法,如果是每次都在切换不同的歌,那么就是「真随机」算法。
▲ 洗牌算法本质来自洗扑克牌。图片来自:Phys.org
这两种哪种方法更好一些?对于目前的用户来说,洗牌算法要更能接受一些,理论上它更加具备可控性,又能满足用户乱序播放的要求,还能防止重复听到一首歌的可能性。
目前在各大音乐 App 中用得比较多的是「洗牌算法」,比如用户数量很大的网易云音乐和 QQ 音乐等播放器都在使用。
好的随机算法应当是怎样的
但即便「洗牌算法」本身有足够多的优点,但原始的「洗牌算法」已经无法满足日益增长的听歌需求,或者说也有播放器越改越糟糕的情况。比如知乎提问中,很多人都感觉网易云音乐的随机算法有着很大问题,比如只放一小部分固定的歌曲,而有些歌曲似乎永远随机不到。甚至有的用户还表示自己删除的一首歌曲还能被随机到。
其实 App 对于这个「随机列表」是有干预的,而并非简单的进行洗牌,而但从结果上说,到底用户感知是好还是差,就看各家对于「洗牌算法」的理解和设计了。尽管吐槽网易云算法的用户不少,但也并不影响推荐歌单和评论等受到欢迎的功能。
根据知乎简介为 QQ 音乐产品经理的用户刘彦彬的回答,在洗牌算法之中也会掺杂更多的大数据算法干预:
根据产品团队调研,用户想要的其实不是真正的「随机播放」,而是用户更多是不知道听哪首,更多是选择困难,希望能帮我做决定。而且,尽量的符合我当前的心境。
随机算法可以解决选择困难,但是并不能真正解决用户需要的心境,因为「洗牌算法」并不会知道用户究竟想要什么。但是音乐应用其实是可以做到这一点的,在足够大的个人听歌数据样本和大数据调研情况下,算法可以做出一些判断,用户此刻更想要听哪些歌。
▲ QQ 音乐。图片来自:YouTube
举个简单的例子,比如说在夜深人静的深夜点开随机播放,那么用户很大可能性是不想听比如金属、摇滚等过于吵杂的音乐,结合用户以往的听歌历史,这个时候随机算法就会根据用户当前的环境时间,更多的随机到轻音乐。
不然你以为那些听歌报告为什么那么详细,你夜里不睡觉循环了多少遍哪首歌,它都一清二楚。
QQ 音乐产品经理刘彦彬还总结了好的随机算法应该具备的几条特征:
- 记录我本地或最近一段时间的听歌记录,尽量在随机时不会推荐出来,保证随机的新鲜感
- 洗牌算法做好,尽可能的隔开某个歌手,某张专辑,让用户从感官上感觉是一个随机列表
- 可以在本地做用户操作记录,比如跳过歌曲的次数,对用户不感兴趣的歌曲进行降权或者过滤,精选随机的池子
- 在对歌曲标签丰富后,可以做的事情就更多了,比如根据当前的场景,推荐本地适合收听的歌曲优先随机播放,这些都有助于让用户感知智能。
▲ Spotify 的随机播放。图片来自:REGENDUS
对随机播放算法调研的当然不只是 QQ 音乐,一直以推荐算法闻名的流媒体音乐服务 Spotify 也有对「洗牌算法」更深度的思考,甚至他们还在官网里面写出了如何改进随机播放算法。
即便是对于 Spotify 这样的流媒体音乐,依然有许多用户会觉得随机播放不「随机」,Spotify 的洗牌算法当然是随机的,但他们开始思考为什么用户会这样觉得。
从基础上说,Spotify 从提供服务开始就用的是 Fisher-Yates 洗牌算法,他们觉得这个洗牌算法做的最出色。
▲ 如果用不同颜色代表不同歌手,这意味完全真随机时,上下两种列表都可能出现
不过,Spotify 一开始并不理解用户说的「不随机」是什么意思,但在研究之后发现,用户的核心理念是不希望一位歌手在短时间内重复出现,但这里其实用户陷入了了一个经典的「赌徒谬论」,当人们连续几次没有中彩票时,就会认为自己下次中奖的几率会增大,而其实每次概率都是独立而相同的。
但如果用户连续听到某一位歌手的作品时,他们就会粗暴的觉得这个算法「有问题」。
结论表示,用户并不喜欢「完美的随机」。
比起「完美」,用户更喜欢的是「平衡」
那什么是「不完美的随机」?
在马丁菲德勒(Martin Fiedler)的博客文章 「混洗音乐的艺术」中,他展示了为什么完全的随机列表是糟糕的。
假设在你的播放器中存在三种不同曲风的流派分别是 A、B、C,其中 A 有 10 首,B 和 C 都是 11 首,一共 32 首歌。如果使用真正的随机算法来洗牌会出现怎样的情况?可能是:
AACBBCBACABBCCACCCCABBACBACABABB
其中出现了连续的 C 曲风流派,以及在四分之一的时间里是没有 B 曲风流派的,对于用户来说,重复单一的曲风无疑是糟糕的。而绝对的随机算法,很可能在大部分情况下都会生成这种糟糕的播放列表,因为绝对的随机也意味着「不平衡」。
▲ 图片来自:Marie Claire
更好的随机里列表是为了满足用户无法下决定但又想要获得新鲜感的心理,这时就应该尽可能的避免重复和单调,所以下面这种播放列表才是更合适的:
ABCBCABACBACBCABCACBABCACBACBCAB
很四平八稳的一个播放列表,没有任何「异常」存在,马丁菲德勒称之为「平衡洗牌」。为了实现将歌单洗牌更加平衡,马丁菲德勒发明了一套较为复杂的洗牌算法,如果你对具体实现感兴趣,也可以直接移步到这篇博客。
Spotify 借鉴了这个算法,但将之修改为更适合自己的方式,并且同时借鉴了抖动算法(例如 Floyd–Steinberg 抖动),最终将歌曲更加均匀平衡的分散到播放列表之中。
就是这样,今天,各家的随机播放算法虽然大都基于「洗牌算法」的模式,但也都有着自己的「调味秘方」,有的用户会喜欢,也有做的糟糕的,不停被用户吐槽的。
但本质上,随机播放算法的重点不在于「随机」,而是一场产品和用户之间的心理博弈对决,甚至它们会随着你的听歌习惯的逐渐养成,自身也在改变着随机歌单的加权倾向。
越听,它们就会越了解你。
相关推荐
- 外婆都能学会的Python教程(二十六):Python中的函数式编程
-
前言Python是一个非常容易上手的编程语言,它的语法简单,而且功能强大,非常适合初学者学习,它的语法规则非常简单,只要按照规则写出代码,Python解释器就可以执行。下面是Python的入门教程介绍...
- [编程基础] Python lambda函数总结
-
Pythonlambda函数教程展示了如何在Python中创建匿名函数。Python中的匿名函数是使用lambda关键字创建的。文章目录1介绍1.1简单使用1.2Pythonlambda与m...
- 一文掌握Python中列表推导和 Lambda 函数
-
嵌套列表推导与嵌套列表推导式一起工作:matrix=[[jforjinrange(5)]foriinrange(3)]print(matrix)#Createsa3x5...
- python中函数详解和实践
-
少看美女多学习来吧客观:1.函数定义使用def关键字定义函数:deffunction_name(parameters):"""函数文档字符串""&...
- Python基础编程20例之七:filter过滤,筛选奇数
-
20230115星期日:list_value=[1,2,3,4,5,6,7,8,9]defis_qishu(n):ifn%2==1:returnTrue...
- Python 匿名函数Lambda的9种用法
-
简单的lambda函数x=1f=lambdax:x+1print(f(1))这个简单的lambda函数接受一个参数x,并返回x+1的结果。将lambda函数赋值给变量ad...
- python匿名函数lambda的语法特点和应用场景
-
在Python的编程过程中,有时我们会碰到一些很简单的计算,但是感觉专门为这个计算创建个函数又觉得太小题大做,这时就可以用到lambda表达式。lambda是用于创建匿名函数,也就是没有具体名称的函...
- python组合函数不允许你还不会的 10 个高效技巧
-
以下是Python中组合函数的10个高效技巧,涵盖函数串联、柯里化、装饰器链式调用等场景,助你构建灵活的数据处理流水线:一、基础组合技巧1.函数管道(Pipeline)defadd(x):...
- 刘心向学(21)Python中的迭代器与内置函数
-
分享兴趣,传播快乐,增长见闻,留下美好!亲爱的您,这里是LearningYard新学苑。今天小编为大家带来文章“刘心向学(21)Python中的迭代器与内置函数”欢迎您的访问。Share...
- Python之函数式编程:funcy,功能更加齐全的函数式编程库
-
引言通过前面的关于Python中进行函数式编程的系列文章的介绍,我们已经把函数式编程范式中的相关特性,以及Python内置的类、functools模块对函数式编程范式的支持,都介绍了一遍。今天这篇文章...
- Python高级编程技巧:深入理解函数式编程
-
引言Python是一种多范式编程语言,支持面向对象、命令式、以及函数式编程等多种编程范式。函数式编程以其简洁、高效和易于并行处理的特点,在处理大规模数据和复杂逻辑时显示出独特的优势。本文将深入探讨Py...
- Python中级篇~函数式编程的概念和原则(匿名函数和高阶函数)
-
Python的函数式编程是一种编程范式,它是基于数学中的函数概念而产生的。在函数式编程中,函数被看作是一等公民,可以像变量一样被传递和操作。函数式编程具有很多优点,包括代码的可读性、可维护性和可扩展性...
- Python函数中几个特殊又很有用的函数,一定要搞明白函数式编程
-
带你走进@机器人时代Discover点击上面蓝色文字,关注我们Python函数提供了一种表单简单的函数的方式,成为lambda表达式,我们来看看下面的例子:#常规函数写法defy(m,n)...
- Python匿名函数详解:从概念到实践
-
一、什么是匿名函数?在Python中,匿名函数(AnonymousFunction)是一种不需要显式命名的函数,通常用lambda关键字定义。与使用def定义的普通函数相比,匿名函数更简洁,适合定义...
- Python 函数进阶的10大技巧,不允许你还不会
-
函数是Python编程的核心构建块,掌握高级函数技巧可以显著提升代码质量和开发效率。以下是Python函数编程的进阶技巧:1.函数参数高级用法1.1灵活的参数处理#位置参数、默认参数、可变参数...
- 一周热门
- 最近发表
- 标签列表
-
- ps图案在哪里 (33)
- super().__init__ (33)
- python 获取日期 (34)
- 0xa (36)
- super().__init__()详解 (33)
- python安装包在哪里找 (33)
- linux查看python版本信息 (35)
- python怎么改成中文 (35)
- php文件怎么在浏览器运行 (33)
- eval在python中的意思 (33)
- python安装opencv库 (35)
- python div (34)
- sticky css (33)
- python中random.randint()函数 (34)
- python去掉字符串中的指定字符 (33)
- python入门经典100题 (34)
- anaconda安装路径 (34)
- yield和return的区别 (33)
- 1到10的阶乘之和是多少 (35)
- python安装sklearn库 (33)
- dom和bom区别 (33)
- js 替换指定位置的字符 (33)
- python判断元素是否存在 (33)
- sorted key (33)
- shutil.copy() (33)