音楽プレーヤーにシャッフルアルゴリズムを実装するのがいかに難しいかはいつも耳にしますが、実際にはその説明はありません。何が難しいのですか?
たとえば、私がそれをどのように実装するかを見てみましょう:
曲を歌う= [0、1、2、3、4];
songs
配列を新しい配列にコピーします。たとえば、shuffle
shuffle
配列が任意のアルゴリズムでランダムにソートされますshuffle
配列は、たとえばに格納されます。セッション開始時にロードされる永続化用のテキストファイルshuffle
配列が[2, 4, 0, 1, 3]
になったとしましょう曲が再生されると、shuffle
配列から削除されます。例えば。
//シャッフルは[2、4、0、1、3] while(shuffle.length> 0){ player.play(shuffle [shuffle.length- 1]); shuffle.pop(); } //最初の反復で曲3が再生され、配列は[2、4、 0、1] // 2番目は曲1を再生し、配列は[2、4、0] // 3番目は曲0を再生し、配列は[2 、4] など
次に、すべての曲が再生されると、songs
から新しい配列が再びランダムに生成され、新しい曲が追加された可能性があります。たぶん、最後の曲の前に2、3曲歌って、前の曲が終わるまでに新しいアレイが準備できるようにするかもしれません。
shuffle
からまだ削除されていないため、まだ再生されていない曲のみが聞こえます。誰かが20000曲を持っている場合でも、配列は(整数インデックスで参照する場合)125 KBのファイルのみになります。
人々がランダムとして理解することとランダムが実際に意味することは2つの異なるものであるため、音楽プレーヤーにとってシャッフルは難しいです。ユーザーの期待に応えるのは困難です。ユーザーは、曲がランダムに選択されることを期待していると言いますが、ランダムに選択したくないものはたくさんあります。プレイリストをランダムにシャッフルするためのアウトラインには、ユーザーのシャッフルに対する期待を実際に満たしていないこと以外、何も問題はありません。
ユーザーは、コレクションを循環して曲を均等に配分してセミランダムに再生する、キュレートされたプレイリストのようなものを本当に望んでいます。これは、単にランダムな曲を選んだり、コレクションをランダムに注文したりするよりもはるかに難しい作業です。これらの多くは、使用および考慮に入れることができる曲に関する十分なメタデータを確立しているため処理できますが、それらのバランスを取ることは困難な作業です。
5曲の例では、シャッフルの約59.3%で2つの隣接する曲が順番に再生されます。
リスナーにとってこれはランダムではないように見えます。
それに加えて、いつ再編成するかをどのように決定しますか?ユーザーがデバイスをオフにしてから再びオンにした場合、デバイスは「すでに聞いた」リストをリセットしますか?
しかし、主な理由はスキップです。ユーザーは、好きではない曲をスキップし、シャッフルされたリストを、各曲を聞くように強制された場合よりもはるかに速く進みます。
これは、彼らが「なぜそれが常にRoxetteを選ぶのか?!??!」 「愛であったにちがいない」というコピーよりも一時的に頻繁に、シャッフルされたリストで通常発生します*
* 4/5元のスウェーデン語版、プラグなし版、ライブ版および拡張版が必要です