2

rand()関数を使用してカードのデッキをシャッフルしようとしていますが、何らかの理由で、シャッフルされたデッキがどのように見えるかを確認しようとすると、完全にシャッフルされていない状態で表示されます。何が足りないのかわからないので、助けていただければ幸いです。

void Deck::Shuffle()
{


for (int j = 0; j <= 51; j++)
{
    srand(time(0));
    int i = 1 + rand()%52;
    int k = 1 + rand()%52;

    Card temp = theDeck[i];
    theDeck[i] = theDeck[k];
    theDeck[k]= temp;
}
}

編集:皆さんの助けに感謝します。今読むようにコードを修正しました。

 void Deck::Shuffle()
{
srand(time(0));

for (int j = 0; j <= 51; j++)
{

    int i = 1 + rand()%52;
    int k = 1 + rand()%52;

    Card temp = theDeck[i];
    theDeck[i] = theDeck[k];
    theDeck[k]= temp;
}
}
4

3 に答える 3

7

srandを呼び出すたびにではなく、プログラムの実行ごとに1回だけ呼び出す必要がありますrand。最近のコンピューターの速度により、ループは非常に高速に実行されているため、同じシードを使用して乱数ジェネレーターをリセットし続けるため、おそらく毎回同じ乱数を取得します(時間はおそらく変化しません)実行を通じて)。それを修正します。

更新:あなたの修正はより良いです、しかしさらに良いのはこれでしょう:

int main()
{
    srand(time(0));

    // the rest of your program here.
}
于 2012-09-08T05:48:57.547 に答える
2

ランダムシードの問題とは別に、式を使用し1 + rand()%52;てスワップインデックスを計算します。1これにより、との間の数値が生成され52ます。つまり、デッキの最初のカードをシャッフルすることはなく、配列の境界を超えてデータを変更することにより、未定義の動作のリスクがあります。

于 2012-09-08T05:58:18.547 に答える
1

おそらくあなたの問題は、srandを繰り返しそして素早く連続して呼び出すことに関係しています。

基本的に、time(0)は、十分に速く呼び出すと同じ値を返します。つまり、randにシードする値は同じになり、ループ内のrandに同じ値が返されます。forループの前に、srandを1回だけ呼び出してみてください。例えば:

srand(time(0));

for (int j = 0; j <= 51; j++)
{
    int i = 1 + rand()%52;
    int k = 1 + rand()%52;

    Card temp = theDeck[i];
    theDeck[i] = theDeck[k];
    theDeck[k]= temp;
}
于 2012-09-08T05:51:53.093 に答える