JavaScript の質問用スレッド vol.11

このエントリーをはてなブックマークに追加
250Name_Not_Found
var tramp=new Array('s0','s1','h0','h1','d0','d1','c0','c1');
配列をランダムバラバラに並びかえる方法を教えて下さい。
251Name_Not_Found:02/07/23 00:33 ID:yG1fNPDd
>>250
for(var i = 0; i < 100; ++i) {
var j = Math.floor(Math.random()*tramp.length);
var x = tramp[0]; tramp[0] = tramp[j]; tramp[j] = x;
}
252Name_Not_Found:02/07/23 00:47 ID:???
>>250
こんなのもありか。
tramp.sort( function () { return Math.floor(Math.random()*3)-1; } );
253Name_Not_Found:02/07/23 03:33 ID:???
function SwapImage(ImageName, FileName1, FileName2)
{
    document.images[ImageName].src = (document.images[ImageName].src.indexOf(FileName1) != -1) ? FileName2: FileName1;
}
254Name_Not_Found:02/07/23 07:23 ID:eVqT0wlq
>>252
それはまずいんじゃ…sortに渡す比較関数が単なる乱数だとsortが終わらない
かもよ。
255Name_Not_Found:02/07/23 07:47 ID:???
>>251,>>252
どうも。
考えてる途中で眠り込んでしまいました。
簡単そうでやたら難しかったです、これ。
ありがとうございました。
256Name_Not_Found:02/07/23 08:40 ID:nwsRAfA2
考え直したのだけど、配列の各要素についてそれを交換する
位置を乱数によって決定するのが一番よさそうだと思う。
for(var i = 0; i < tramp.length; ++i) {
var j = Math.floor(Math.random()*tramp.length;
var x = tramp[i]; tramp[i] = tramp[j]; tramp[j] = x;
}
これで計算量がO(N)だよね。シャッフルするためだけに計算量
がO(N log N)になるsortを呼ぶのは勧められない気が。もっとも
トランプの札程度ならどうでもいいという考えもあるかな。
257Name_Not_Found:02/07/23 09:49 ID:???
var i, j, x;
for ( i=0; i<array.length-1; i++ ) {
j = Math.floor( Math.random()*array.length-i );
x=array[i], array[i]=array[i+j], array[i+j]=x;
}
参考: ttp://tt.sakura.ne.jp/~suzu/tips/shaffle.html