import java.util.*;/*** https://cloud.tencent.com.cn/developer/news/1045747* 偽隨機播放音樂*/
public class MusicPlayer {private List<String> allSongs; // 所有歌曲列表private List<String> playedSongs; // 已經播放過的歌曲列表private Map<String, Integer> songPreferences; // 歌曲偏好權重public MusicPlayer(List<String> allSongs) {this.allSongs = allSongs;this.playedSongs = new ArrayList<>();this.songPreferences = new HashMap<>();// 初始化所有歌曲的偏好權重為1for (String song : allSongs) {songPreferences.put(song, 1);}}// 根據偏好權重隨機選擇下一首歌曲public String getNextSong() {List<String> availableSongs = new ArrayList<>(allSongs);availableSongs.removeAll(playedSongs);if (availableSongs.isEmpty()) {// 如果所有歌曲都播放過了,重置播放列表playedSongs.clear();availableSongs = new ArrayList<>(allSongs);}// 計算總權重int totalWeight = availableSongs.stream().mapToInt(song -> songPreferences.get(song)).sum();// 生成一個隨機數Random random = new Random();int randomWeight = random.nextInt(totalWeight);// 根據權重選擇歌曲int cumulativeWeight = 0;for (String song : availableSongs) {cumulativeWeight += songPreferences.get(song);if (randomWeight < cumulativeWeight) {playedSongs.add(song);return song;}}return null; // 正常情況下不會執行到這里}// 更新歌曲偏好權重public void updatePreference(String song, int weight) {if (songPreferences.containsKey(song)) {songPreferences.put(song, songPreferences.get(song) + weight);}}public static void main(String[] args) {List<String> songs = Arrays.asList("Song1", "Song2", "Song3", "Song4", "Song5");MusicPlayer player = new MusicPlayer(songs);// 模擬用戶偏好,增加某些歌曲的權重player.updatePreference("Song1", 3);player.updatePreference("Song3", 2);// 模擬播放10首歌曲for (int i = 0; i < 10; i++) {System.out.println("Now playing: " + player.getNextSong());}}
}
你是否曾想過音樂播放器的隨機播放的歌曲真的是完全隨機的嗎?不,它們在騙你!
我們來介紹一下偽隨機和真隨機。
偽隨機算法是最常見的一種,它會從播放列表中隨機選擇一首歌曲播放,然后根據一些規則來決定下一首播放的歌曲。例如,它可能會排除已經播放過的歌曲,以避免重復播放。另外,一些播放器還可能會根據歌曲的類型、時長、評分等因素來決定下一首播放的歌曲。
而真隨機算法則會完全隨機選擇一首歌曲播放,沒有任何規則和預測。但這種算法并不常見,因為它可能會導致某些歌曲被播放多次,而有些歌曲則幾乎不會被播放。
如果,要表達的更清楚一些的話,如下:
真隨機,它就像抓鬮一樣,沒有列表的概念,也沒有上一首和下一首的概念,它會隨機到不同的音樂。而偽隨機,是被算法所操縱的隨機,算法在你選擇隨機播放時,一個完整的播放歌單或許就形成了。
那么如何判斷是真隨機還是偽隨機呢?其實只要按上一首就知道了。如果切換到是你剛才聽過的那一首,那就是偽隨機。如果是每次都在切換不同的歌,那么就是真隨機。
說到這里,大概有一個概念了,那就是大部分的音樂軟件會推崇偽隨機算法。為什么?
原因就是,用戶選擇隨機播放就是為了滿足自己無法下決定但又想要獲得新鮮感的心理,這時就應該盡可能的避免重復和單調。如果是真隨機算法的話,那么可能導致某些歌曲被播放多次,而有些歌曲則幾乎不會被播放。
但這不是主要的,如果隨機播放的歌是用戶討厭的呢?或者無論怎么隨機播放,歌都不是用戶不喜歡的,那用戶會開始討厭這個平臺,平臺的用戶留存變少,轉去其他平臺。
打個比方,用戶喜歡聽古風歌曲,那么在它聽歌時,前一首是古風,后一首就變成了嘻哈搖滾風,本來想著沒準第三首就好了,結果第三首是純音樂,換你你能接受嗎?
用戶的整體聽歌體驗都變得割裂了,于是用戶轉戰其他平臺,自己的平臺用戶大量流失。
那么,為了提高用戶對于平臺的粘滯力,偽隨機是最好的選擇。于是平臺會干預隨機列表,算法根據你平時的習慣,不斷地推送那些你喜歡聽的歌,迎合你的喜好。
而且,這還能讓用戶不需要自己搜就能找到想聽的歌曲,甚至可以找到好多自己想聽卻忘記名字的歌了。