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

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

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

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

一、背景

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协议

相关推荐

台积电提出SRAM存内计算新方法,能效比可达89TOPS/W

芯东西(公众号:aichip001)编译|高歌编辑|云鹏芯东西3月16日消息,近期,台积电的研究人员在ISSCC2021会议上公布了一种改良的SRAM存储器阵列,该SRAM阵列采用22nm工...

Golang中如何判断两个slice是否相等?

在Golang中,要判断两个slice是否相等是不能直接使用==运算符的(==只能说明两个slice是否指向同一个底层数组)。如果两个slice的底层数组相同,但长度或容量不同...

JS入门基础知识(js基础知识总结笔记)

JS对象操作对象增删改查创建对象letobj={}新增属性obj.a=1修改属性obj.a='a'...

趣谈JS二进制:File、Blob、FileReader、ArrayBuffer、Base64

大家好,我是Echa。好久没跟粉丝们细聊JavaScript那点事了。做一名全栈工程师,JS基础还是要打牢,这样的话不管底层业务逻辑以及第三方框架怎么变化,都离不开基础。本文文章属于基础篇,阅读有点...

告别 substr() 和 substring()?更可靠的 JavaScript 字符串截取方法

JavaScript提供了三个主要的字符串截取方法:...

golang第九天,切片(slice)介绍(golang 切片作为参数)

什么是切片golang切片是对数组的抽象。go的数组长度不可改变,在特定场景中这样的集合就不太适用,go中提供了一种灵活,功能强悍的内置类型切片(“动态数组”),与数组相比切片的长度是不固定的,可以追...

Go语言零到一:数组(go struct数组)

引言...

你说你熟悉Slice,这道slice题你能答对吗?

每当你花费大量时间使用某种特定工具时,深入了解它并了解如何高效地使用它是很值得的。...

Python 3.14七大新特性总结:从t-string模板到GIL并发优化

Python3.14已进入测试阶段,根据PEP745发布计划,该版本已停止引入新功能,也就是说新特征就应该已经固定下来了。所以本文基于当前最新的beta2版本,深入分析了Python3.14中...

Python 幕后:Python导入import的工作原理

更多互联网精彩资讯、工作效率提升关注【飞鱼在浪屿】(日更新)Python最容易被误解的方面其中之一是import。...

Python元类实现自动化编程的正确姿势

元类是Python中用于创建类的类。通过元类机制,开发者可在运行时动态创建和修改类,为框架开发、设计模式实现和高级架构设计提供核心支持。在Python语言的高级特性中,元类占据着独特而重要的地位。作...

Python字符串详解与示例(python字符串类型及操作)

艾瑞巴蒂字符串的干货来了,字符串是程序中最常见的数据类型之一,用来表示数据文本,下面就来介绍下字符串的特性,操作和方法,和一些示例来吧道友:1.字符串的创建在python中字符串可以永单引号(...

恕我直言!你对Python里的import一无所知

文章来源:https://mp.weixin.qq.com/s/4WAOU_Lzy651IE-2zZSFfQ原文作者:写代码的明哥...

Python基础:字符串操作(python字符串的用法)

字符串是Python中最常用的数据类型之一,用于表示文本数据。我们将学习如何对字符串进行常见的操作,包括创建、访问、修改和处理字符串。通过掌握这些技巧,您将能够更好地处理和操作文本数据。让我们开始吧!...

Python 中 字符串处理的高效方法,不允许你还不知道

以下是Python中字符串处理的高效方法...