我想知道各种音乐播放器是否遵循固定的模式/算法来随机播放列表。根据我的猜测,我可以弄清楚这些媒体播放器使用相同的算法进行随机播放。我之所以这么说,是因为实际上我已经对同一播放列表上各种播放器的随机播放功能的行为进行了实验。因此,如果是这样的话,那么那个算法是什么?
再次,如果我的猜测是错误的,并且每个播放器都使用自己的随机播放算法,那么我怎么能在从具有相同播放列表的各个播放器随机播放后获得相同的歌曲序列
编辑:
我的问题是想知道所有音乐播放器是否都共享一个通用的随机播放算法。如果是,那么是哪种算法?如果不是,那么为什么我从诺基亚手机 5233、5300、VLC 媒体播放器、Windows 媒体播放器等随机播放同一个播放列表后得到了相同的歌曲序列。
答案1
有许多不同的 shuffle 算法费舍尔-耶茨是最受欢迎的算法之一。即使玩家使用该算法,其实现也取决于许多其他因素(编码语言、随机数支持)。除非玩家直接从另一个程序复制代码,否则实现会有所不同。
此外,虽然大多数播放器都会“随机播放”播放列表,但我见过一些播放器总是随机选择下一首要播放的歌曲(导致同一首歌曲连续播放两次)。
奇怪的是,您声称不同的玩家会以相同的顺序“随机播放”同一个播放列表。即使使用相同的算法(或相同的玩家),每次随机播放时也应该会产生一个随机的播放列表。
答案2
从我对 Apple 产品的观察来看,虽然随机播放确实具有随机元素来选择接下来要播放的项目,但似乎每个项目也会根据播放历史、用户评分(星级)和播放列表中的包含情况进行排名。排名较高的项目更有可能在随机播放中更早出现。
答案3
不久前,我为 PSP 做了一个小型媒体播放器(我从未发布过它),并且我实现了如下的随机播放功能:
- 你给音乐播放器上的每首歌曲无符号整数id,范围从0到
n
(n
播放器中的歌曲数量)。 - 使用当前时间(毫秒)加上最后一首歌曲 ID 作为种子生成一个随机数,使其成为整数并以
n
(歌曲数量)为模:|random(time+last_id)|%n
。因此,伪随机 ID 的范围从 0 到,n
并且如果“随机播放”之间的间隔小于一毫秒,它就不会重复,因为random(time)
如果随机种子(time
在本例中)也是相同的数字,则会产生相同的数字。 - 保存最近播放的歌曲列表
m
,以便新随机选择的歌曲至少不会在m
不同歌曲之间重复。如果新歌曲在列表中,则重复步骤 2。
对我来说,它工作得很好,使用长度为 90% 的列表,.9*n
我永远不会得到重复的歌曲。当然,对于包含许多歌曲的歌曲库来说,这效率不高。但 PSP 只能存储几百首歌,所以还行。