JavaScriptの配列をsort関数でシャッフルする
あえてsort関数を使う方法でシャッフルしてみる。比較関数自体がランダムな値を返す場合と違って、これなら偏らない。
Array.prototype.shuffle = function() {
return this.map(function(a){ return { weight: Math.random(), value: a } })
.sort(function(a, b){ return a.weight - b.weight })
.map(function(a){ return a.value });
}とりあえずFirefox1.5でOK。IEでもmap関数を自分で定義してやれば大丈夫のはず。
置換によるシャッフルと違って、weight値のところを適当に変化させれば、要素ごとに重みづけてのシャッフルもできると思う。たとえばよく聞く曲は優先的に前の方に持ってくるとか、その逆とか。iTunesのシャッフルがそうなってるかどうかは知らないけれども。