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のシャッフルがそうなってるかどうかは知らないけれども。