隨機(jī)音樂的藝術(shù)

今天瀏覽Spotify官方博客時被一篇介紹音樂隨機(jī)播放算法的博客吸引蛮拔,隨后對這個問題小小研究了一下吃粒。

隨機(jī)播放音樂坪稽,這個功能太普通以至于以前從未考慮過其背后實現(xiàn)邏輯匿刮。

Random還是shuffle

我們經(jīng)常使用的隨機(jī)播放功能县忌,在外國同行口中并不是叫Random播放掂榔,而是叫Shuffle继效,洗牌的意思。

為什么不是Random装获?來看兩個例子瑞信。

在Spotify成立之初,他們使用一種叫「Fisher-Yates shuffle」的算法去產(chǎn)生一個完全隨機(jī)(perfectly random )的播放列表穴豫,這個算法據(jù)說非常簡單凡简,只需3行代碼搞定,不過它存在致命弱點精肃。

上圖中秤涩,每種顏色代表一位歌手,也就是說我的列表里有綠色歌手的4首歌司抱,紅色歌手的2首歌筐眷,黑色歌手的2首歌。

圖中上下兩行都是運行Fisher-Yates算法可能產(chǎn)生的播放列表习柠,請問這兩個列表出現(xiàn)的概率哪個更大呢浊竟?

答案是一樣大,完全隨機(jī)算法下津畸,每一首歌出現(xiàn)在每個位置的概率是一樣的振定。你可能認(rèn)為這怎么可能,前面已經(jīng)出現(xiàn)3次綠色歌手的歌了肉拓,下一次出現(xiàn)概率應(yīng)該很小了吧后频。錯了,算法是沒有記憶的暖途,除非你告訴它卑惜,下一首不允許播放綠色歌手的歌,否則它播放綠色歌手的歌的概率還是50%驻售。

再來看個例子露久,假設(shè)你播放列表里有10首搖滾樂(A),11首鄉(xiāng)村樂(B)欺栗,11首爵士樂(C)毫痕,下面是我自己用Python的random函數(shù)生成的序列:

A A A A C C C B C B B A C B C B B B B A B C B A C A C C A A C B

可以看出,這個列表里前半段和后半段基本上沒有B出現(xiàn)迟几,尤其是前面連續(xù)4個A和3個B消请,這樣的結(jié)果是無法令人滿意的,一點均衡性都沒有类腮。

回頭再想臊泰,我們?yōu)槭裁匆S機(jī)播放?因為我們不知道要聽什么蚜枢,我們想要一個隨性的播放列表缸逃,我們不想專門聽某一位歌手的或某一張專輯的曲目针饥,我們不想按照平常循環(huán)的順序播放,我們想換換口味有點新意需频,所以我們把這個選擇權(quán)交給軟件本身去做丁眼,如果軟件接連給你播放同一個歌手或同一張專輯的曲目,那就違背我們隨機(jī)的目的了贺辰。所以好的隨機(jī)播放列表應(yīng)該做到均衡分布户盯,同一個流派嵌施、同一個歌手饲化、同一種專輯下的音樂彼此之間相距越遠(yuǎn)越好。

還是上面這個例子吗伤,好的播放列表應(yīng)該是下面這樣的:

A B C B C A B A C B A C B C A B C A C B A B C A C B A C B C A B

shuffle播放算法

那么如何生成上面這個均衡的播放列表呢吃靠?博主Martin Fiedler給了一個思路。

1)將列表中的歌曲按流派足淆、歌手巢块、專輯等邏輯范式分組,給這個組里的音樂設(shè)定一個隨機(jī)播放順序巧号;
2)接下來把每個分組的曲目通過合并算法組成一個完整的播放列表族奢。

很簡單吧,僅僅兩步而已丹鸿。接下來看看合并算法是怎么一回事越走。假設(shè)在第一步我們得到了下面的分組:

將每個分組擴(kuò)充到和最大分組相等的長度,比如給綠色分組填充8首「靜默」歌曲靠欢,讓該組長度等于12廊敌。填充的時候應(yīng)盡量讓組中的音樂均衡分布列表中。

每個分組都填充完畢后门怪,就開始合并新列表了骡澈,從每個分組的第1列按隨機(jī)順序取出歌曲放在新列表中。

再取出第2列按隨機(jī)順序取出歌曲放在新列表中掷空。

第3列肋殴。需要注意的是,假如第2次取出的是黃-紅-藍(lán)坦弟,第3次取出藍(lán)-黃-紅-綠疼电,那么就會有兩個藍(lán)色分組的歌曲接連出現(xiàn)的情況,這個時候需要把第3次拿出的歌曲首尾互換减拭,最后得出綠-黃-紅-藍(lán)的順序蔽豺。

這就是shuffle播放背后的大概邏輯了,難的不是合并算法拧粪,而是填充分組的算法修陡,個人感覺沧侥。


參考資料:

  1. How to shuffle songs?
  2. The art of shuffling music
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市魄鸦,隨后出現(xiàn)的幾起案子宴杀,更是在濱河造成了極大的恐慌,老刑警劉巖拾因,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旺罢,死亡現(xiàn)場離奇詭異,居然都是意外死亡绢记,警方通過查閱死者的電腦和手機(jī)扁达,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蠢熄,“玉大人跪解,你說我怎么就攤上這事∏┛祝” “怎么了叉讥?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長饥追。 經(jīng)常有香客問我图仓,道長,這世上最難降的妖魔是什么但绕? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任救崔,我火速辦了婚禮,結(jié)果婚禮上壁熄,老公的妹妹穿的比我還像新娘帚豪。我一直安慰自己,他們只是感情好草丧,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布狸臣。 她就那樣靜靜地躺著,像睡著了一般昌执。 火紅的嫁衣襯著肌膚如雪烛亦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天懂拾,我揣著相機(jī)與錄音煤禽,去河邊找鬼。 笑死岖赋,一個胖子當(dāng)著我的面吹牛檬果,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼选脊,長吁一口氣:“原來是場噩夢啊……” “哼杭抠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起恳啥,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤偏灿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后钝的,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體翁垂,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年硝桩,在試婚紗的時候發(fā)現(xiàn)自己被綠了沿猜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡亿柑,死狀恐怖邢疙,靈堂內(nèi)的尸體忽然破棺而出棍弄,到底是詐尸還是另有隱情望薄,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布呼畸,位于F島的核電站痕支,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蛮原。R本人自食惡果不足惜卧须,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望儒陨。 院中可真熱鬧花嘶,春花似錦、人聲如沸蹦漠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笛园。三九已至隘击,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間研铆,已是汗流浹背埋同。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留棵红,地道東北人凶赁。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親虱肄。 傳聞我的和親對象是個殘疾皇子楼熄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容