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