この質問がばかげている場合は申し訳ありませんが、ストレートな答えが見つからないからではないと思います。標準の Fisher-Yates シャッフルを実装しようとしていますが、jQuery でラップされた DOM 要素の配列を使用しています。 つまり、通常の「スワップ」アルゴリズムです。
アイデアは、トランプのシャッフルを実装することでした。
私の最初のシンプルな(しかしハックな)ソリューション:
1) 各 DOM 要素に index 属性を割り当て、同時にインデックスのリストを作成します。
indices = [];
deck.each(function(i){
$(this).attr('index',i);
indices[i] = i;
});
2) インデックス配列をシャッフルし、
for(i=0;i<indices.length;i++){
temp = indices[i];
j = Math.floor((Math.random()*i));
indices[i]=indices[j];
indices[j]=temp;
}
そして、次のようなものを使用して、それらを繰り返します。
for(i=0;i<indices.length;i++){
randomCard = $('[index='+indices[i]+']');
//do amazing game-like things
}
しかし...私はこの解決策が嫌いです.それは非常にハッキーに感じます. ラップされたセットを操作したいです。
それで...
もう一度、Fisher-Yates shuffle の疑似コードを示します。
deck.each(function(i){
temp = deck[i]; //except that I want deck[i] to be a **wrapped object**
j = Math.floor((Math.random()*i));
deck[i]=deck[j]; //and deck[j] should find a wrapped object in the 'elements' set with index j
deck[j]=temp; //and this should perform the swap.
alert("I can haz swapburgers!!!"); //yay.
});
私が理解していない部分は、jQuery でラップされたオブジェクトの要素の値をそのインデックスで設定することです。インデックスと親要素をスワップ関数に渡す必要がありますか? 何かのようなもの
swap($(this).parent(),i,j);
誰かがこれを整理するのを手伝ってくれるなら、私はそれを感謝します. これがすべて明確であることを願っています。紛らわしい場合はお知らせください。明確にするよう努めます。