音樂隨機播放的演算法是怎樣的?可能做到產生一個和原來順序完全一樣的歌單嗎?如果有幾率是多少?


設有n首歌,點播第一首時有n個選擇,點播第二首時為了不重複有n-1有選擇,如此類推,可知n個元素有n!種排列。原來順序的排列是其中一種,所以其概率是frac{1}{n!}

傳統上這種演算法稱為 shuffle (洗牌)演算法,例如一般常用的的 Fisher–Yates shuffle 現代版本,需要O(n)空間及時間。但要產生n!種排列,就需要周期大於n!的偽隨機數生成器。例如常用的偽隨機數生成器 MT19937 的周期為 2^{19937}-1,由於 2080! < 2^{19937} - 1 < 2081!,所以它能生成最長n=2080個元素的所有排列。


可以。計算機的隨機都是偽隨機,一個特定的隨機演算法下,相同的隨機種子會帶來一致的隨機結果。


我覺得在用戶視角去看的話,我不希望是真的隨機,完全沒有規律,因為即使用戶是選擇隨機模式,他也會希望聽到自己最愛的那幾首歌的。

我希望的是,在N歌曲中,每首歌都有一個播放次數,程序會把這個播放次數當作權值比重,然後在進行對N首歌曲的隨機。

說白了點,就是我播放次數越多的歌曲,在一次隨機周期播放時,被隨機到的概率會更高。這裡的一次隨機周期要解釋下,就是在這個M次隨即次數時,已經隨機的到歌曲,便不再參與隨機,即你第一次就隨機到播放次數最高的那首歌,那麼在M次中,不會再出現這首歌曲,過了M次,就又加入這首歌。

PS:以上都是我YY的~~


這看產品是怎麼設計的,最簡單的就是直接用rnd[0,listCount),複雜點每次把播放過的歌曲移出一個內部的列表,然後再剩下的歌曲里隨機。再複雜點,根據之前記錄下你的喜好,喜歡的權重大一點,可能隨機到的機會大一些,等等。完全看怎麼設計啊


我覺得不是純隨機

感覺還會根據歌曲類似度和播放頻率來判斷

我們的歌單中總有一些是播放頻率高的,也就是我們較喜歡的,大家隨即聽歌時應該期待過下一首是我喜歡的,我常聽的那一首吧

還有,比如我常聽杰倫的歌,能不能說明我喜歡列表中大部分杰倫的歌嘞^o^/


洗牌演算法 + 固定隨機種子


網易雲音樂,如果你從同一首歌開始,每次隨機播放都是一樣的順序。

對,我就是平時只聽紅心列表,開隨機播放,還必須切到我最想聽的那首開始的人。


理論上來說,利用計算機的偽隨機和特定的演算法,你想要多少幾率都可以。。。實際中對音樂播放器來講這方面的需求並不是很重要,或者說對這方面潛在需求的研究還並不深入,因為其他方面可以改善又立桿見影的東西太多了啊啊啊啊啊。。。。。


這個完全看產品需求啊,你要可重複的播放順序,多一個記錄操作而已......所謂的演算法實現完全重複的順序都不太靠譜


就我知道的而言,qq音樂的隨機播放是在點隨機播放按鍵的一剎那生成一份重新排序的歌單,然後按照這一個歌單一遍一遍的循環,並不是所想的每下一首歌都是隨機的。如果實現這種功能的話,就c/c++而言一個鏈表就好了。


有一個重點大家都忘了,那就是除了剩餘N-1都有可能選到以外,其他「每一首的概率要一致

關於隨機性的探討,是編程裡面比較難的點,推薦你看一下《計算機程序設計藝術》卷二


如果只有一首歌或者兩首歌呢


創一個只放一首歌的歌單


隨機數產生方法取決於寫程序的人和他用的語言。

假設歌單實現了真隨機的話,產生一個完全相同的歌單取決於你的歌單長度。

mathbb{E}(P)=prod_{i=0}^{n-1}frac{1}{n-i}

以及我看不出來程序員過度複雜這個過程的動機…如果是按照口味之類的產生的偽隨機要多複雜,而且完全可以當新功能賣啊。


推薦閱讀:

C++ 如何實現平衡的名次樹?
為什麼常見的O(n)時間的找凸多邊形內最大內接三角形的那個演算法是錯誤的?
通過脈搏波PPG波形推導血壓(主要是SBP)有沒有可能性,結合其它例如年齡、體重等參數呢?
演算法 第四版(algorithms 4th edition ) 這本書有配套的習題答案嗎?
有可能利用監控實時識別每一個出現的人么?

TAG:演算法 | 編程 | 音樂播放器 |