人々はあなたがコンテナを使用していないことを訴えている:STLは(あまりにもシャッフルアルゴリズムを持っています。あなたの配列のサイズを宣言していません。それは問題ではないことに心配しないでください。カードへのポインタの配列を持っている。しかし、私はそれがクラッシュする理由はありません。あなたのコードに基づいて、私が書いたサンプルコードです:
#include <stdio.h>
#include <stdlib.h>
#define DECK_SIZE 24
void shuffle(int deck[]) {
int n = DECK_SIZE, t;
while (n > 1) {
long k = lrand48() % DECK_SIZE;
n--;
t = deck[n];
deck[n] = deck[k];
deck[k] = t;
}
}
int main(int argc, char **argv) {
int deck[DECK_SIZE], i;
for (i = 0; i < DECK_SIZE; ++i)
deck[i] = i + 1;
shuffle(deck);
for (i = 0; i < DECK_SIZE; ++i)
printf("%i\n", deck[i]);
return 0;
}
これを実行すると、正常に動作します。つまり、何か別のことが起こっているということです。デッキにあるすべてのカードの値を印刷してからシャッフルして、そこにセグメンテーションがあるかどうかを確認してみてください。
ただし、コードにエラーがあります。あなたの機能は正しくシャッフルされません。シャッフルする正しい方法は、デッキ全体から選択したカードに各カードを入れ替えるのではなく、Nの位置の各カードを0..Nの範囲から選択したカードと入れ替えることです。各カードをランダムカードと交換した場合、N^Nの可能な結果が得られます。カードを元の場所に戻すと、重複する可能性があります。 3枚のカードデッキでは、これは間違っていることが明らかです。なぜなら、3枚のカードの3!= 6の順列があるにもかかわらず、27種類のシャッフルで終わるので、そのうちいくつかは同じです。問題は、6が27の係数ではないので、いくつかの順列は他の順列よりも可能性が高いということです。
が
void shuffle_correctly(int deck[]) {
int i, t, k;
for (i = 2; i < DECK_SIZE; ++i) {
k = lrand48() % i;
t = deck[i-1];
deck[i-1] = deck[k];
deck[k] = t;
}
}
この行にtempとは何ですか?deck [k] = temp ;? –
"deckSize--"の直後に "Card * temp = deck [deckSize]"が表示されていないようです。コピー+貼り付けエラーですか、それとも実際にコードから抜けている行ですか? –
私はそのコードに全く何か悪いことはありません。私は問題は、カードの値や配列の初期値を印刷することであると推測します。それらのコードを投稿する必要があります。 – TrayMan