2

配列内のアイテムをシャッフルする関数を書いています。

this.shuffle = function () {
    ...

まず、配列の2つの半分を取得し、3番目の空の配列を設定します。

    this.leftHalf = this.cards.slice(0, this.size() / 2);
    this.rightHalf = this.cards.slice(this.size() / 2);
    this.result = [];

次に、各半分から1枚のカードを結果の配列に入れます。

    for (var i = ...) {
        this.result.unshift(this.leftHalf[i]);
        this.result.unshift(this.rightHalf[i]);
    }

最後に、結果の配列を元の配列に割り当て、「一時」変数を削除します。

    this.cards = this.result;

    delete this.leftHalf;
    delete this.rightHalf;
    delete this.result;
}

私の質問:これはこの問題に取り組むための賢明な方法ですか、それとも一時変数の設定を伴わないより良い方法がありますか?代わりにプライベート変数を使用することを考えました(ただし、パフォーマンスが向上するかどうかはわかりませんでした)。

var leftHalf, rightHalf, result;

this.shuffle = function () {
    leftHalf = ...

私が間違っていることが明らかなことがあったかどうか、またはこれらの場合のベストプラクティスがあるかどうかだけが気になります。

4

3 に答える 3

1

要素のセットの順序をランダム化するための優れたアルゴリズムはたくさんあります。簡単な方法の1つは、最後の要素をリストのランダムな要素と交換することです。次に、n-1番目の要素を最初のn-1要素のランダムな要素と交換し(リストの長さがnであると想定)、n-2番目の要素を最初のn-2要素のランダムな要素と交換します(注要素をそれ自体と交換する可能性があります。)

これの単純な実装では1つの一時変数を使用しますが、完全に配置するためのトリックがあります。これらはほとんど必要なく、通常は読みやすさを低下させます。

于 2012-07-29T20:56:25.220 に答える
1

パフォーマンスに大きな違いがあるとは思えませんが、プライベート変数と1つのループなしでそれを行うことができます。左側のシャッフルが必要で、一番上のカードが一番上になり、真ん中のカードが2番目になり、デッキの長さが偶数Nになると仮定します。

for(var i=...) {
   if(i%2 == 1) 
      newdeck[i] = oldeck[N/2+(i-1)/2];
   if(i%2 == 0) 
      newdeck[i] = oldeck[i/2];
}

これは、元のアルゴリズムと同じように、いわゆる完全なシャッフルを実行しますが、人々が言っ​​ているように、これは予測可能であるという意味でランダムではありません。注文したデッキからランダムに見えるデッキに到達するには、7つの完璧なシャッフルを実行する必要があるという有名な論文があります。この記事のように、左右のシャッフルを使用してデッキ内のカードを制御することもできます。

于 2012-07-29T20:59:35.890 に答える
1

シャッフルという用語を言うとき、それはランダムでなければなりません。以下は、ランダムな方法でarral値を再配置することを示すために作成したスニペットです。

var shuffle = function() {

        var _deck = [ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M" ],
        _shuffle = [],
        _slice; 

        do {

           // return's a random index
           _splice = Math.floor( Math.random() * _deck.length );

           // store the random value in new array
           _shuffle.push( _deck[ _splice ] );

           // splice the random value
           _deck.splice( _splice, 1 );

        } while ( _deck.length );

    };

@hackartistが述べたように、このhttp://blogs.discovermagazine.com/crux/2012/07/16/surprising-connection-between-card-shuffling-higgs-boson/を読んで、さらにシャッフルメソッドに拡張して自己実行することができますX回

于 2012-08-23T09:38:52.597 に答える