背景

绝大多数音乐播放器的随机播放算法都采用洗牌算法(Shuffle),即将歌单中所有歌随机打乱顺序播放。但是考虑到用户在软件的使用过程中会不断往歌单中添加新的歌曲,在洗牌算法中无论新歌旧歌都会无差别地随机打乱,如此生成的随机列表没有照顾到用户想更多听新歌的想法。本文旨在提出能够在随机播放过程中考虑不同歌曲已听次数的随机播放算法。该算法应该有如下几条原则:

  1. 已听次数越低的歌应有越高的几率被播放;
  2. 杜绝某一首歌连续播放的情况(除非只有一首歌);
  3. 尽量避免某一首歌在短期内多次播放;
  4. 长时间没听过的歌应有一定的概率提升;

符号约定

N N N:歌曲总数,播放 N N N首歌称为一个循环
D D D:歌单播放次数的方差
i i i:歌单中第 i i i首歌
p [ i ] p[i] p[i]:选中概率,第 i i i首歌下一次被选中的概率
h [ i ] h[i] h[i]:增益,第 i i i首歌下一次被选中的概率的增益
H H H:总增益, H = ∑ i = 1 N h [ i ] H = \sum^{N}_{i=1}h[i] H=∑i=1N​h[i]
t [ i ] t[i] t[i]:播放次数,第i首歌已经播放的次数
t _ m a x t\_max t_max:最高播放次数, t _ m a x = m a x ( t ) t\_max = max(t) t_max=max(t)
T T T:总播放次数, T = ∑ i = 1 N t [ i ] T = \sum^{N}_{i=1}t[i] T=∑i=1N​t[i]
w [ i ] w[i] w[i]:等待次数,第i首歌距离上一次播放之间播放了的歌曲数,初始化 w [ i ] = N w[i] = N w[i]=N
X X X:次数补偿

算法

1.补次算法

符合原则1。设置一个根据 t _ m a x t\_max t_max计算的次数补偿X来对所有歌的播放概率进行补偿,高播放次数的歌得到的补偿小、低次数反之。一般令 X = t _ m a x + a X = t\_max + a X=t_max+a,其中 a > = 1 a >= 1 a>=1, a a a越大补偿越小,伪代码如下:

X = max(t) + 1
for i in N:h[i] = X - t[i]
H = sum(h)
for i in N:p[i] = h[i]/H
chosen = random_choice(p)
t[chosen] += 1
play(chosen)
2.概率恢复算法

符合原则2、3、4。所有歌曲基础播放概率为 1 N \frac{1}{N} N1​,某一首歌播放后将其播放概率清零,在其他歌播放的同时逐渐恢复其概率甚至提升到更高的水平。规定一个循环使得概率恢复到正常值,伪代码如下:

for i in N:h[i] = (1/N)*(w[i]/N)
H = sum(h)
for i in N:p[i]=h[i]/H
chosen = random_choice(p)
t[chosen] += 1
play(chosen)
for i in N:w[i] += 1
w[chosen] = 0
3.等次比优先算法

符合原则1、2、3、4。称一首歌的等待次数和播放次数之比为等次比 r [ i ] = w [ i ] t [ i ] r[i] = \frac{w[i]} { t[i]} r[i]=t[i]w[i]​,可见 w w w增大会使其提升、t增大会使其减小,以此作为增益是可以考虑的。伪代码如下:

for i in N:h[i] = w[i]/(t[i]+1)
H = sum(h)
for i in N:p[i]=h[i]/H
chosen = random_choice(p)
t[chosen] += 1
play(chosen)
for i in N:w[i] += 1
w[chosen] = 0
4.补次概率恢复算法

综合了补次和概率恢复算法,符合原则1、2、3、4 。以补次后的概率为基础,加以概率恢复算法,伪代码如下:

X = max(t) + 1
for i in N:h[i] = (X-t[i])*(w[i]/N)
H = sum(h)
for i in N:p[i]=h[i]/H
chosen = random_choice(p)
t[chosen] += 1
play(chosen)
for i in N:w[i] += 1
w[chosen] = 0

性能

以下测试了同一初始状态下播放200首歌的纯随机算法、等次比、补次概率恢复算法的性能。
可以看见等次比和补次概率恢复算法都能在满足原则1、2、3、4的情况下有效降低方差D。

算法——音乐播发器中考虑已听次数的随机播放算法相关推荐

  1. vue-music(1)音乐播发器 项目开发记录

    Vue-Music 跟学一个网课老师做的仿原生音乐APP跟学的笔记,记录点滴,也希望对学习vue初学小伙伴有点帮助 一| 前期工作 1.项目初始化 npm install -g vue-cli vue ...

  2. 一种基于喜爱程度的音乐随机播放算法

    打开你手机中的音乐播放器,开始播放音乐,选择播放模式,共有四种 顺序播放    随机播放   循环播放    单曲循环 选择随机播放时,你真的希望是随机么,还是懒得手动选择?你是否希望随机时听到自己喜 ...

  3. Android实战 - 音心音乐播发器 (主界面实现)

    开发平台 : eclipse , ubuntu ,android  sdk 4.0+ 1.背景 主页的设计从上往下依次是滚动广告(ViewFlipper ),分类信息( GridView ),热门榜单 ...

  4. 写一个算法交换单链表中p所指结点与其后继结点-21算法题

    本题为算法题,交换的是结点,而不是结点的值 注意题目是交换结点,不是交换结点的值. 设q为1,p为2,r为3,r->next为4.原来为1234 1指向3,2指向4,3指向2.最终顺序为1324 ...

  5. fisher-yates_使用Fisher-Yates随机播放算法以O(n)时间随机播放给定数组

    fisher-yates Example: 例: Say the input array is [1, 2 3, 4, 5 6, 7] After reshuffling it can be anyt ...

  6. 计算机算法在生物信息学中的应用,引力场算法及其在生物信息学中的应用

    引力场算法及其在生物信息学中的应用 [摘要]:优化算法是当今的重要研究课题,能够从海量数据中获得所需最优解,也是极具挑战的工作.优化算法可定义如下:给定某一待解问题,求该问题的最优解,此问题一般以N元 ...

  7. 应用计算机解数学模型之我见,计算机模拟算法在数学建模中的应用

    金渤淏 摘 要:随着世界科学技术水平的普遍提高,电子计算机技术逐渐发展成熟,其中计算机模拟算法在其他学科中有着十分广泛的应用,从而给这些学科的研究提供了算法基础.电子计算机技术中的计算机模拟算法是指安 ...

  8. 【优化布局】基于差分进化算法求解电力系统负荷分配中的应用问题matlab代码

    1 简介 差分进化算法在处理连续域.非凸.不确定性和全局优化问题时具有优势,已在包括电力系统最优潮流在内的诸多领域得到广泛应用.电力系统最优潮流是一个复杂的非线性优化问题,要求在满足特定的电力系统运行 ...

  9. android播放器可点击列表,Android上是否有任何播放器可以支持播放列表中的本地视频并可以预设播放顺序?...

    试用Android QQ视频和Vplayer,它确实支持许多视频格式,但是发现它们不支持列表播放. 例如,当前手机上有5个视频剪辑,希望在播放器中设置不同的顺序以顺序播放. 就ABCDE而言,我可以尝 ...

最新文章

  1. 2017 Multi-University Training Contest 3 hdu 6063
  2. 【转载】MySQL启多个实例
  3. Element-UI 的基本使用||基于图形化界面自动安装
  4. 每一种创伤,都是一种成熟
  5. 在服务器上处理gis文件,云服务器处理gis
  6. 马云语录,非常值得一看(转)
  7. D. 关灯问题(规律或二分)
  8. 【APICloud系列|38】 微信登录分享、QQ登录分享实现方法
  9. 东南大学的计算机类和电子信息哪个专业好,东南大学王牌专业有哪些及专业排名...
  10. 转载:YUM常用命令介绍
  11. [原]浅谈几种服务器端模型——反应堆模式(epoll 简介) - _Boz - 博客园
  12. Webstorm全版本汉化包
  13. 互联网大数据项目汇报计划书PPT模板
  14. MySQL之Explain
  15. MySql 查询比其中某一位讲师工资少的教师姓名、工资和职称
  16. 陶哲轩实分析定理 11.4.3 $\max$与$\min$保持黎曼可积性
  17. 云计算与大数据技术 李春燕
  18. 企业数字化转型之传统IT架构改造
  19. 我用PhpWebshell抓肉鸡
  20. 解析如何评估并部署Web应用防火墙

热门文章

  1. Twisted学习(三)---------------Deferred介绍
  2. MongoDB数据库备份(mongodump)以及恢复(mongorestore)工具实践
  3. Ubuntu系统搜索不到蓝牙耳机
  4. 哈哈哈!程序员被女朋友拉黑之后...该怎么办?
  5. creo导出零件点坐标时没有点菜单
  6. 第15周项目1-验证算法
  7. php局部全局变量,PHP局部变量与全局变量
  8. 一款超级好用的文本编辑器:Notepad++下载,别再使用记事本了
  9. 通过 Java 代码获取 JVM 参数
  10. redis订阅怎么退出_Coroutine\Redis 订阅模式 调用退订无效果