Люди жалуются, что вы не используете контейнеры и не объявляете размер вашего массива. Не беспокойся об этом, это не проблема. Кто-то также сказал, что вы пересекаете границы массива, а это не так. Можно иметь массивы с размером, который не объявлен. Также хорошо иметь массив указателей на карту. Но я не понимаю, почему он падает. Вот пример кода, который я написал на основе вашего кода:
#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;
}
Запустите его, он отлично работает. Это означает, что происходит что-то еще. Попробуйте напечатать значение всех карт в вашей колоде, прежде чем вызывать shuffle, чтобы увидеть, нет ли там и ошибок, я подозреваю, что так и будет.
Однако в вашем коде есть ошибка. Ваша функция не перетасовывается правильно. Правильный способ перетасовать - это не менять местами каждую карту с картой, выбранной из всей колоды, а менять каждую карту в позиции N на карту, выбранную из диапазона 0..N. Если вы поменяли каждую карту случайной картой, вы получите N ^ N возможных результатов, некоторые из которых пересекаются, если вы меняете карту обратно на ее первоначальное место. С колодой из трех карт очевидно, что это неправильно, потому что в итоге вы получите 27 различных перемешиваний, некоторые из которых одинаковы, даже если есть 3! = 6 комбинаций из 3 карт. Проблема в том, что, поскольку 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;
}
}