2017-12-02 7 views
-2

配列の順序を混在させようとしていますが、その内容は失われません。それは私がそれを混ぜたいカードのデッキです。どこに問題がある別の配列で配列をシャッフルする

私はここに、私が通信に使用しています複数のファイルを持っているのです。

class Deck{ 

    private: 
     PlayingCard deck[52]; 

    public: 
     Deck(); 

     void shuffle(); 

     double draw(); 

     void printDeck(); 
}; 

だから、私はデッキのインスタンスを作成し、私はきちんと全体のデッキをプリントアウトすることができますよ、と私はちょうどそれをミックスしたい:

void Deck::shuffle(){ 
    int randNum; 
    string tmp; 
    srand(time(NULL)); 

    for(int i = 0; i < 52; i++){ 
     randNum = rand()%52; 
     deck[i] = deck[randNum]; 
    } 
} 

だから私は、私は、ランダムな番号を割り当てていますし、何が二回同じ乱数を得ることから、それを妨げるものはないことを知っています。私は乱数を2回取得せずに呼び出す別の方法があるかどうか、あるいは呼び出すべき別の方法があるかどうかはわかりません。私はどのようにカードを混ぜるのですが、同じカードを2回印刷することはできません。あなたがデッキ[randNum]の2番目のコピーを作っているので、

+4

あなたはおそらく['std :: suffle'](http://en.cppreference.com/w/cpp/algorithm/random_shuffle)を探していますか?しかし、あなたがDIYを主張する場合、ヒント:割り当てないで、交換してください。 –

+0

私たちが与えた例は、それと似たものを使用していますか?そうではなく、私は何をするべきですか?彼の例では、彼は私が持っているものを正確に行い、うまくいきません。 @IgorTandetnik – Nick

答えて

0
deck[i] = deck[randNum]; 

これは、不正な動作が得られます(randNum限り!= i)は次の2つの数字を入れ替えたい場合は

あなたができる

PlayingCard tmp = deck[i]; 
deck[i] = deck[randNum]; 
deck[randNum] = tmp; 

それとも

std::swap(deck[i], deck[randNum); 

それともイゴールTandetnikが指摘したように、あなたはSTDを使用することができます::シャッフル代わりにOループ全体。

+0

ありがとうございました。私は近いと分かっていた! – Nick

関連する問題