私は一連の整数を持つ2つの配列を持っています。私は、デッキをシャッフルするためにカードのデッキを繰り返しカットすることをシミュレートしたい。私はカット位置を設定し、配列Aのカット前のすべてを配列Bの先頭に代入します。スライスを使用して配列Aへの参照を作成しないようにする必要があることを理解していますが、すなわちarrayB.slice(0,3) = arrayA.slice(49,52)
?Javascriptで配列をシャッフルする
答えて
繰り返し挿し木が本当にシャッフルを模倣する場合、私は知らないが、多分それはあなたがやっているすべてではありません。とにかく、私はあなたの説明を理解した内容に基づいて、あなたがしたい:
arrayB = arrayA.splice(49,52).concat(arrayB);
これは、以前に保有していたものを目の前にarrayA
から削除された部分を有する変性arrayB
を生じるはずです。
あなたは、あなたがArray.prototype.slice()
代わりのArray.prototype.splice()
を使用し、arrayA
は何arrayB
に行くことarrayA
にもはやであるように変更されたくないん場合。
var a = [ 'a1', 'a2', 'a3', 'a4' ];
var b = [ 'b1', 'b2', 'b3', 'b4' ];
b = a.splice(0, 2).concat(b);
// a is now: [ 'a3', 'a4' ]
// b is now: [ 'a1', 'a2', 'b1', 'b2', 'b3', 'b4' ]
:
var a = [ 'a1', 'a2', 'a3', 'a4' ];
var b = [ 'b1', 'b2', 'b3', 'b4' ];
var removedFromA = a.splice(0, 2);
var removedFromB = b.splice(0, 2);
b = removedFromA.concat(b);
a = removedFromB.concat(a);
// a is now: [ 'b1', 'b2', 'a3', 'a4' ]
// b is now: [ 'a1', 'a2', 'b3', 'b4' ]
サンプル1(「スプライス()を使用しています...」)では、その構文は何ですか?私はスプライスを次のように呼び出さなければならないと考えました: deckA.splice(startIndex、numberToReplace、Element1 ... ElementN); NEVERMIND、私はそれを得ました、私はsplice()メソッドによって返された配列のconcatを呼び出しています。優れた! – Stephen
私は正しい方向に向いてくれてありがとう。私はついにこのコードに頼りました: deckB = deckA.splice(0、cutPos); deckB = deckA.concat(deckB); これは2番目のデッキへの結果と1つのカットです。次に、次の操作のためにBをAにコピーします。 deckA = deckB.slice(0,16); – Stephen
問題はありません。あなたが好きなように働くことができてうれしいです。 :) – JAAulde
あなたの例のように関数の戻り値に何かを代入するのはあまり意味がありません。
spliceの方法を調べてみると、必要なものが表示されます。
例:
var a = arrayA.splice(0,10); //remove the first 10 elements from arrayA and assign them to a
var b = arrayB.splice(0,10); //see above;
Array.prototype.push.apply(arrayA,b); //add the elements you removed from ArrayB to arrayA
Array.prototype.push.apply(arrayB,a); //see above.
スプライスはまさに私が必要としていたものです。 – Stephen
これはうまくいきます。割り当ての問題については正確です。しかし、私は@Stephenがある配列から取り除かれたものがもう一方の配列の前に行くことを望んでいたという印象を受けました。 'Array.prototype.push()'はそれらを最後に置きます。 – JAAulde
待って、いいえ、それは動作しません。 'Array.prototype.push()'は、スプライスから得られた配列を、それがプッシュされた配列の最後の要素として設定します。だから、あなたは '[1,2]、[Array]のようなものになります。私が最初にそれを見たとき、私は' .push() 'が知らない何かの魔法をしているに違いないと思っていました。 .concat() '。しかし、テストの結果、 '.concat()'が正しいことがわかりました。 – JAAulde
あなたが探している場合、私はあなたの質問から、本当に100%明確ではないよsplice()
を使用して
カードのデッキをシャッフルするための良い方法、またはslice
に関する詳細情報が必要な場合。この答えのために私は前者を仮定します。
シャッフルのように一見単純なものを得るのは実際にはとても簡単ですwrong。 (あなたのシャフリングのアプローチが偏見を持ち、いくつかの組み合わせを他のものよりずっと一般的にするという意味では間違っています)。
シャッフルをするより良い方法は、Fisher-Yates Shuffling Algorithmのようなアルゴリズムを使用することです。
私は(JavaScriptで)書いて、ここで私が使用したコードのカードゲームのためにこれをした:
// this.drawPile is an array of cards
var n = this.drawPile.length;
while (n > 1) {
n--;
var k = Math.floor((n + 1) * Math.random());
var temp = this.drawPile[k];
this.drawPile[k] = this.drawPile[n];
this.drawPile[n] = temp;
}
これは完全には関係ないですが、あなたがの両側をシャッフルするとき、完全なランダム性をシミュレートしたい場合デッキは、これを試してください...
const shuffle = (arr1, arr2) => {
if(!(arr1 instanceof Array) || !(arr2 instanceof Array)) return [];
var ar1 = arr1.length >= arr2.length ? [...arr1] : [...arr2];
var ar2 = arr1.length >= arr2.length ? [...arr2] : [...arr1];
let x = 0;
for(let i = 0; i < ar1.length; i++) {
if(x > ar2.length-1) break;
ar1.splice(Math.floor(Math.random() * (ar1.length+1)), 0, ar2[x]);
x+=1;
}
return ar1;
};
私は新しい配列を返します参照してください。私は2つの配列だけでこれをしようとしているので、私はどのように任意のインデックス位置で新しい配列に配列のスライスをコピーすることができますかと思います。ちょうど参照をコピーしているようだ。 – Stephen