プレイリストのシャッフルを考えてみる。その2。



結局前のページに書いたことをそのままプログラムしたわけで、面白みはあまりないんだけども。

アクティブプレイリストをシャッフルする関数と、Xorshift。


//アクティブなプレイリストをシャッフル
// 2016/12/12 Junya Renno

//乱数用シード
var x = 123456789;
var y = 362436069;
var z = 521288629;
var w = 88675123;
w = +new Date();

//Xorshift関数
function xorshift(a,b){
var t;
t = (x ^ (x << 11));
x = y;
y = z;
z = w;
w = (w = (w ^ (w >> 19)) ^ (t ^ (t >> 8)));
return (a+w)%b
}

function activelist_shuffle(){
var maxcount = plman.PlaylistItemCount(plman.ActivePlaylist);
var tmp_list = [];
for(i = 0; maxcount > i ; i++){
tmp_list[i] = i+1;
}

//別に用意した配列をシャッフル
for(i = maxcount - 1; i > 0; i--) {
var j = Math.floor(xorshift(0,i+1));
var tmp = tmp_list[i];
tmp_list[i] = tmp_list[j];
tmp_list[j] = tmp;
}

//プレイリスト関連の処理
var shuffled_number = plman.PlaylistCount;
var handle_list = plman.GetPlaylistItems(plman.ActivePlaylist);
var new_handle_list = plman.GetPlaylistItems(-1); //空のハンドルリスト作成

for(i = 0; handle_list.Count> i ; i++){
//シャッフルした配列をガイドにトラックを追加
new_handle_list.add(handle_list.Item(tmp_list[i]-1));
}
plman.CreatePlaylist(shuffled_number, "shuffled");
plman.InsertPlaylistItems(shuffled_number, 0, new_handle_list);
plman.ActivePlaylist = shuffled_number;

//後処理
tmp_list = [];
handle_list.dispose();
new_handle_list.dispose(); 
}

//実行
activelist_shuffle();


こんな感じになっております。




参考:
LumberMill's Note - 「Xorshift」による擬似乱数生成
和田維作のホームページ - 良い乱数・悪い乱数
Web備忘録 - [JS]配列のシャッフル


 

コメントは日本語でお願いします。(URLは入力禁止:Do not URL writing.) :System message: コメントを受けつけています。