2011-08-13 12 views
0

私は一連の整数を持つ2つの配列を持っています。私は、デッキをシャッフルするためにカードのデッキを繰り返しカットすることをシミュレートしたい。私はカット位置を設定し、配列Aのカット前のすべてを配列Bの先頭に代入します。スライスを使用して配列Aへの参照を作成しないようにする必要があることを理解していますが、すなわちarrayB.slice(0,3) = arrayA.slice(49,52)Javascriptで配列をシャッフルする

+0

私は新しい配列を返します参照してください。私は2つの配列だけでこれをしようとしているので、私はどのように任意のインデックス位置で新しい配列に配列のスライスをコピーすることができますかと思います。ちょうど参照をコピーしているようだ。 – Stephen

答えて

0

繰り返し挿し木が本当にシャッフルを模倣する場合、私は知らないが、多分それはあなたがやっているすべてではありません。とにかく、私はあなたの説明を理解した内容に基づいて、あなたがしたい:

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' ] 
+0

サンプル1(「スプライス()を使用しています...」)では、その構文は何ですか?私はスプライスを次のように呼び出さなければならないと考えました: deckA.splice(startIndex、numberToReplace、Element1 ... ElementN); NEVERMIND、私はそれを得ました、私はsplice()メソッドによって返された配列のconcatを呼び出しています。優れた! – Stephen

+0

私は正しい方向に向いてくれてありがとう。私はついにこのコードに頼りました: deckB = deckA.splice(0、cutPos); deckB = deckA.concat(deckB); これは2番目のデッキへの結果と1つのカットです。次に、次の操作のためにBをAにコピーします。 deckA = deckB.slice(0,16); – Stephen

+0

問題はありません。あなたが好きなように働くことができてうれしいです。 :) – JAAulde

2

あなたの例のように関数の戻り値に何かを代入するのはあまり意味がありません。

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. 
+0

スプライスはまさに私が必要としていたものです。 – Stephen

+0

これはうまくいきます。割り当ての問題については正確です。しかし、私は@Stephenがある配列から取り除かれたものがもう一方の配列の前に行くことを望んでいたという印象を受けました。 'Array.prototype.push()'はそれらを最後に置きます。 – JAAulde

+0

待って、いいえ、それは動作しません。 'Array.prototype.push()'は、スプライスから得られた配列を、それがプッシュされた配列の最後の要素として設定します。だから、あなたは '[1,2]、[Array]のようなものになります。私が最初にそれを見たとき、私は' .push() 'が知らない何かの魔法をしているに違いないと思っていました。 .concat() '。しかし、テストの結果、 '.concat()'が正しいことがわかりました。 – JAAulde

0

あなたが探している場合、私はあなたの質問から、本当に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; 
} 
+0

しかし、仮面ライダーシャッフラーがちょうどそれをするかもしれないので、理論的にはまだ100回もデッキをカットしないだろうか? – Stephen

+0

申し訳ありませんが、私は「デッキをカットする」という定義を誤って適用しました。 1回の切断でシーケンスが維持されます。私は、「リッフル」や「ダブテール」のシャッフルではなく、繰り返しカットされた「スライドシャッフル」を指していました。 – Stephen

0

これは完全には関係ないですが、あなたがの両側をシャッフルするとき、完全なランダム性をシミュレートしたい場合デッキは、これを試してください...

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; 
};