Aug 30, 2006
実践JavaScriptで配列をシャッフルする方法リファクタリング
http://www.fumiononaka.com/TechNotes/Flash/FN0212002.html
Fisher-Yatesというアルゴリズムだそうです。
Array.prototype.shuffle = function() {
var i = this.length;
while(i){
var j = Math.floor(Math.random()*i);
var t = this[--i];
this[i] = this[j];
this[j] = t;
}
return this;
}
a = [1,2,3,4,5];
a.shuffle() // 3,1,5,2,4
a // 3,1,5,2,4
ごく普通に実装するとランダムに一件ずつ取り出すのがわかりやすいんじゃないかと思う。Rubyの本とか見ると大体そんな感じで書いてある気がする。JavaScriptには破壊的sliceがないので代わりにspliceを使えば良い。
Array.prototype.shuffle = function(){
var len = this.length;
var ary = this.concat();
var res = [];
while(len) res.push(ary.splice(Math.floor(Math.random()*len--),1));
return res
}
a = [1,2,3,4,5];
a.shuffle() // 3,1,5,2,4
a // 1,2,3,4,5
元の配列には変更を加えず、ランダムに並べ替えられた新しい配列を返す。要素数の増減があるから遅くなるかも。ベンチ取ってないけど。
配列に独自のプロパティを持たせてあったり、toStringをインスタンス固有の関数に置き換えてある配列オブジェクトがあったとして、元のオブジェクトのまま中身をシャッフルしたい、という場合には、中身を直接入れ替えるのが良いでしょう。(最初に書いたやり方のように)
lazyな処理をしたい場合はランダムピック方式の方がやりやすい。巨大な配列をシャッフルしたい場合は、ランダムな順番で要素を返すイテレータを作るのがよいだろう。
Array.prototype.random_iter = function(){
var len = this.length;
var ary = this.concat();
return {
has_next: function(){
return len ? true : false
},
next: function(){
if(!len) return null;
var i = Math.floor(Math.random() * len--);
return ary.splice(i,1)
}
}
}
これなら一万件ぐらいの配列からでも高速に一件ずつ取り出すことができる。
あと配列をランダムに並べ替えるのにsortメソッドを使ってコンペア関数にランダムな値を返すようにする、という方式は片寄る、って話をしてて、なんで片寄るのかを少しわかりやすくしてみた。
http://la.ma.la/misc/js/randomize.html
端っこの要素があまり比較されないで片寄る様子がわかると思います。
なんか大した話でもないのに無理矢理発展させた感が否めない。
javascript - シャッフルシャッフル
なるほど。Schwartzian Transform"の意外な利用法だなあ。
snippets from shinichitomita’s journal - JavaScriptの配列をsort関数でシャッフルする
Array.prototype.shuffle = function() {
return this.map(function(a){ return { weight: Math.random(), value: a ...
Arry#splice の戻り値は常にArrayですね(除NN4)。
Good site
anime carte m竪re TUOI DI RADO CANADA NO TUBO solvente quimico et trop tard dict達 e vocale negra gijon ANIME UM BURRO ANIME REDATTA
Good site
agv per auto Www dpfanatics com ALLENAMENTI NUOTO CAMPIONI SYSRTMVS BENJAMIKN MOOR free pantyhosewifes Naked gymnast DISK DEFRAGMENTER FREE DOWNLOAD Gemellidiversithebest motyw taa�a w literaturze
Good site
GIANMARCO GOTA DE anime a situa estado fisico de La marinera en ANIME NORMAS DE AUDITOR鱈A GENERALMENTE ACEPTADAS ANIME EL ATENEO ARGENTINA Di duplicazione SINO HOTEL Nvidia quadro fx 4000 loro parque tenerife
Good site
anime pier vittorio tondelli Limitato verona Anime e marcia gallbladder fossa DVR STUDIO z pornografico ANIME STIPENDI GIOCATORI lobo solitario y su anime paya konjac tuber GRAFICI WEB
Good site
innova 2005 [url=http://fettl旦sliche-vitamine.italytoursite.info/innova-2005.html]innova 2005[/url] Lagrima de amor mi [url=http://anime-pompa-wodna.italytoursite.info/lagrima-de-amor-mi.html]Lagrima de amor mi[/url] Naturali 2005 [url=http://anime-en-california.italytoursite.info/naturali-2005.html]Naturali 2005[/url] TRANSITO DEL ESTADO DE [url=http://transito-del-estado-de.italytoursite.info/]TRANSITO DEL ESTADO DE[/url] Protese odontologica [url=http://protese-odontologica.italytoursite.info/]Protese odontologica[/url] Luglio 1980 n [url=http://eucalipto-baby-blue.italytoursite.info/luglio-1980-n.html]Luglio 1980 n[/url]
clonedvd
Here’ s something I discovered a couple weeks ago that some people may find useful. It’ s not rocket science or anything and a lot of people probably already knew about it. But I’ m posting it here partially so I remember about it. Anyway, I found you can lock your computer using a shortcut pointed to“% windir%\\ system32\\ rundll32. exe user32. dll, LockWorkStation”. This is very useful for when you have to work on keyboard that is lacking the windows key (like IBM Thinkpads). Once you have the shortcut you...
BogosortをJavaScriptで実装してみた
暇でWikipedia見てたらボゴソートとかいうのを見つけた。JavaScriptでの実装例があまりないようだったので、どうせだからと実装してみることにした。ちなみに、ボゴソートとは「要素をシャッフル→ソートされてたら処理終了、されてなければまたシャッフル」を繰り返す、非常に効率の悪いアルゴリズムである。function isSorted(aArray){ for(var i=0,l=aArray.length-1;i<l;i++){ if(! (aArray[i] <= aArray[i+1])) return false; } return true;}function shuffle(aArray){ return aArray.sort(function(){ return Math.random()*100 <= 50; });}function bogoSort(aArray){ while(!isSorted(aArray)){ shuffle(aArray); }}
writeback message: Ready to post a comment.

