Ho sempre sentito quanto sia difficile implementare algoritmi shuffle per i lettori musicali, ma mai davvero la spiegazione per questo. Cosa lo rende difficile?
Prendiamo ad esempio come implementerei uno:
- Prima l'utente aggiunge 5 brani a una playlist
let songs = [0, 1, 2, 3, 4];
- Quindi l'utente abilita shuffle
- Il programma copia quindi l'array
songs
in un nuovo array, ad esempioshuffle
- Quindi l'array
shuffle
verrà ordinato in modo casuale con qualsiasi algoritmo - L'array
shuffle
è memorizzato in es. un file di testo per la persistenza, che viene caricato all'inizio della sessione - Diciamo che l'array
shuffle
ora è[2, 4, 0, 1, 3]
- Quindi il giocatore riproduce questo array in ordine inverso
-
Quando viene riprodotta una canzone, viene rimossa dall'array
shuffle
. Eg.// shuffle starts as [2, 4, 0, 1, 3] while (shuffle.length > 0) { player.play(shuffle[shuffle.length - 1]); shuffle.pop(); } // First iteration plays song 3, and the array is then: [2, 4, 0, 1] // The second plays song 1, and the array is then: [2, 4, 0] // Third plays song 0, and the array is then: [2, 4] etc.
-
Poi, quando tutti i brani sono stati riprodotti, un nuovo array verrebbe generato nuovamente in modo casuale da
songs
, a cui potrebbero essere stati aggiunti nuovi brani. Magari anche pronunciare un paio di canzoni prima dell'ultimo, in modo che il nuovo array sia pronto al momento della precedente. - Potresti anche interrompere la riproduzione e riprendere più tardi e continuerai a sentire solo brani che non sono ancora stati riprodotti, poiché non sono ancora stati rimossi da
shuffle
Anche se qualcuno ha 20000 brani, l'array sarà solo (dati riferimenti in numeri interi) un file di 125 KB.