Есть намного лучшие способы сделать случайные перестановки. Вот пример, который я нашел в сети. Я позволил себе немного аннотировать код, чтобы объяснить, что происходит.
/* this function generates an array containing a permutation of the numbers 0..n-1 */
int * rpermute(int n) {
/* first, create an array */
int *a = malloc(n*sizeof(int));
int k;
/* fill it in with the numbers 0..n-1 */
for (k = 0; k < n; k++)
a[k] = k;
/* loop backward through the array */
for (k = n-1; k > 0; k--) {
/* swap the k'th element with any element that comes before it (or itself) */
int j = rand() % (k+1);
int temp = a[j];
a[j] = a[k];
a[k] = temp;
}
return a;
}
Это означает, что вам нужно всего лишь пройти через массив дважды: один раз, чтобы построить его, и один раз, чтобы переставить его. Кроме того, каждая перестановка имеет одинаковую вероятность возникновения, что является целью, если вы хотите сделать что-то вроде перемешивания карт в колоде или перемешать слово.
РЕДАКТИРОВАТЬ: помните, функция в этом примере выделяет массив, но вы можете так же легко передать массив в качестве параметра.
РЕДАКТИРОВАТЬ 2: ФОРМАТИРОВАНИЕ! Ааа .. всегда забывай о тех '<' s </p>