百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

为什么随机播放的音乐,有时总是在播?

wptr33 2025-02-27 16:56 18 浏览

一个产品小白对于网易云音乐随机播放的一些想法和思考,资料和相关理论都是通过阅读和自己分析得出的结论,如有不妥请指正。

一、背景

1. 现状

不知道大家有没有这样一种感觉:在使用音乐软件进行随机播放的时候,总是不能播放到心仪的音乐,而且很多歌曲会重复出现。在产生这种困惑之后我同时产生了对随机播放算法和问题的好奇。

于是,我在百度中输入“音乐随机播放”关键词后,在知乎、百度知道、豆瓣都能看到:“没有听到的歌一直没听到,还有一些歌一直重复播”、“好像是在已加载的列表中随机”、“实际结果其实给人的感觉并不随机。某首歌从不出现,和某首歌反复出现,概率其实都很高”、“大部分是根据你听的次数最多的几首歌优先来放,越来越频繁,听的次数就越来越多”等反馈。

2. 用户需求

用户使用随机播放,往往出于以下原因:一是想听到列表里不常听的歌;二是不想或很难作出选择,希望随机播放的功能能够帮助他们选择(懒惰心理)。

但是根据网络上用户的反映和本人的使用体验来看,随机播放功能主要解决第二类用户的需求,对于第一类用户的需求并没有很重视,因此才会出现上面提到的网友的吐槽。

3. 小结

观察后发现,QQ音乐、虾米和其他播放软件的随机播放也有此类问题,而且问题从15-19年都有反映,说明此类问题并没有得到很好的解决。

二、分析

1. 随机播放模式的算法

一般音乐播放器的随机模式分为两种:

1)播放当前歌曲时才随机生成下一首,即完全随机(称为Random算法):为了避免某些歌曲经常重复播放或很难被播放到,并非是盲目的完全随机下一首,而是需要分析用户的播放历史,需要比较好的算法进行支撑,最终始于随机却超脱随机。

2)将当前的list打乱顺序,然后依次播放,也就是大家所说的伪随机(称为Shuffle算法):这一种是目前比较流行的随机模式,完美解决某些歌曲很难被播放到的情况出现,但是却有以下劣势:该模式下,上下曲的顺序是固定的;一个随机播放的list的歌曲全部播放完毕后会重新生成另一个list,但是相邻的list之间容易出现用户所感知的“重复”播放。

根据问答资料整理,大部分音乐播放软件的随机算法是“洗牌算法(shuffle)”。

2. 什么是“洗牌算法”

简单来说就是随机问题,一个从1到n的序列,随机打乱,保证每个数出现在任意一个位置的概率相同。

运用到音乐软件来说,就是系统在歌单内随机抽选歌曲进行随机排列,形成一个新的歌单再进行顺序播放,这就是我们所说的随机播放。

那么洗牌算法中进行排列的总体是什么呢?

在这里我想作一个简单猜测:根据用户反映情况和自身的体验来看,我认为随机播放的总体有4个,分别是全部歌曲(a)、最近播放(b)、按播放量排列的歌曲(c)和喜欢的歌曲(d),随机播放时从中抽取的比例为n1%,n2%,n3%,n4%(n1%+n2%+n3%+n4%=1),那么随机歌单的歌曲总数S=a*n1%+b*n2%+c*n3%+d*n4%。

搞清楚了随机播放的原理后,我们可以尝试分析一下随机播放遇到的问题以及解决方法了。

三、问题反馈及分析

1. 听不到自己喜欢的歌

首先,我将这个问题分为两个场景:

  • 一是用户想听到自己喜欢的歌单里的歌曲,是用户真正的听歌喜好/习惯。那么这个时候随机播放就是要将用户喜爱的这类歌曲进行选择并排列。
  • 二是用户现在没有特定的喜好方向,希望听到一些和平常不一样的歌曲,希望系统帮他们做出选择。这个时候随机播放要做的,就是将用户歌单内的全部歌曲进行随机筛选进行排序。

但是这里就会出现另一个问题。上文提到的随机播放算法的假设中,有四个总体,其中最近播放、播放量排序歌单和喜欢的歌曲都可以归为用户常听的歌曲类别中,如果系统依旧像往常一样运用普通的随机算法来生成随机歌单的话,就会出现随机播放的歌曲是用户最常听的歌曲的情况,这显然不符合用户的需求。

那么我们可以将这两个场景区分开来讨论解决方案:

  • 第一个场景可以参考网易云音乐里的“心动模式”,从用户喜欢的歌曲里抽选歌曲,并随机匹配与用户歌曲风格类似的歌曲进行播放。但是心动模式需要在喜欢的歌曲中才能触发,在普通歌单的播放模式中并没有此选择。为此可以将该模式增加至普通播放模式中,作为一种随机播放模式使用
  • 第二个场景则可以在现有的随机播放的条件下进行优化,例如适当降低播放量排序歌单和最近播放歌曲的选中比例,增加新增歌曲和不常听歌曲的选中几率;对用户听歌时长小于30s的歌曲进行剔除,下一次随机播放排序时不再出现此歌曲。

2. 有的歌曲重复出现,有的歌曲几乎不出现

为什么有的歌曲会重复出现?

是因为洗牌算法中生成的序列是随机的,在用户播放完一个随机播放的歌单后,系统会再次将虽有歌曲进行随机排序,重新生成另一个随机播放歌单,那么这两个歌单之间必然会有歌曲重复出现。

那么我们可以通过降低已听过的歌曲被选中的几率,或者在选中同一首歌曲的时候重新进行洗牌排序来降低此类问题出现的频率。

而有的歌曲几乎不出现,就是上一个问题所探讨的了。随机播放的歌曲选定的总体是固定的,而且偏向用户常听歌曲,因此对于新增歌曲和不常听歌曲被选中的比率就非常小了。

3. 随机播放列表中上一首和下一首歌曲固定

因为洗牌算法下随机播放列表是一种随机排列后顺序播放的列表,所以列表中的顺序是固定的。关于这个问题用户并没有很大的意见,甚至有的很赞同这种模式:“在随机模式中也可以通过上下首切换找到喜欢的歌曲”。

这可以说是洗牌算法的其中一个优势,但是却没有被很好的利用起来。

网易云音乐里使用随机播放模式的时候,无法查看随机播放的歌单。用户只能在播放页面上下切换歌曲,而不能随机选择,而有的时候需要切换多次才会听到想听的音乐。

如果在不改变和优化算法的情况下,将随机播放列表可视化,也是另一个解决思路。用户可以在列表内查看歌曲并随意选择,还能对列表进行自定义,例如对随机播放列表内的歌曲进行删除、调序等操作,让随机播放的歌曲能够更贴合用户实际的需求。

四、可行性分析

分析到这里其实我有点疑惑,为什么问题反馈较多,而且很多程序员也给出了自己的想法和解决方案,但是市面上的音乐软件却迟迟没有动静呢。

1. 影响的用户范围少

各音乐软件在设计过程中必然做了很多的市场及用户调查,而且在产品各功能的设计过程中会考虑到用户的各层面的心理需求,设计解决的也是最大范围的用户的需求。而从该问题的反馈数量来看,相较于网易云音乐的用户数(据网易数据显示,2019Q2网易云音乐用户破8亿)确实微不足道。

而且对于有着“希望能听到平常不常听到的歌曲”的需求的用户,网易云也有着“每日推荐”这类功能的解决方案。因此不需要通过优化随机播放模式的算法来达到满足用户需求的目的。

2. 产生的效果不明显

根据KANO用户需求理论,用户需求分为:基本型、期望型、兴奋型、无差异型和反向型需求。对于随机播放功能而言,是音乐播放软件的基本型需求。不提供此需求,用户的满意度会大幅度降低,但优化此需求,用户满意度也不会得到显著的提升。

基于此,音乐播放软件也无需投入大量的人力和时间来优化此类功能。

五、总结

随机播放功能实质上是机器计算的结果,随着AI的广泛应用和推广,结合AI的自我学习功能和快速计算能力。我相信在以后的计算和推荐功能中会有更贴合用户需求的设计出现,随机播放也会变得更”懂“我们。

作者:HEmEiYing,应届毕业生,产品小白一个,自学入门不久,欢迎批评指正~

本文由 @HEmEiYing 原创发布于人人都是产品经理。未经许可,禁止转载

题图来自Unsplash,基于CC0协议

相关推荐

oracle数据导入导出_oracle数据导入导出工具

关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...

继续学习Python中的while true/break语句

上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个else解...

python continue和break的区别_python中break语句和continue语句的区别

python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...

简单学Python——关键字6——break和continue

Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...

2-1,0基础学Python之 break退出循环、 continue继续循环 多重循

用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...

Python 中 break 和 continue 傻傻分不清

大家好啊,我是大田。今天分享一下break和continue在代码中的执行效果是什么,进一步区分出二者的区别。一、continue例1:当小明3岁时不打印年龄,其余年龄正常循环打印。可以看...

python中的流程控制语句:continue、break 和 return使用方法

Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...

L017:continue和break - 教程文案

continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...

作为前端开发者,你都经历过怎样的面试?

已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...

面试被问 const 是否不可变?这样回答才显功底

作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...

2023金九银十必看前端面试题!2w字精品!

导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。答案:CSS的盒模型是用于布局和定位元素的概念。它由内容区域...

前端面试总结_前端面试题整理

记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...

由浅入深,66条JavaScript面试知识点(七)

作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录由浅入深,66条JavaScript面试知识点(一)由浅入深,66...

2024前端面试真题之—VUE篇_前端面试题vue2020及答案

添加图片注释,不超过140字(可选)1.vue的生命周期有哪些及每个生命周期做了什么?beforeCreate是newVue()之后触发的第一个钩子,在当前阶段data、methods、com...

今年最常见的前端面试题,你会做几道?

在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...