Originariamente inviato da VanBee
Comunque non ho capito bene cosa intendi, in che senso lo mischio tramite degli indici?
Supponendo di voler ricorrere ad un array bidimensionale:
codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROWS 13
#define COLS 4
#define NTIMES 50
void generate(int array[][COLS])
{
int i, j;
for (i = 0; i < ROWS; ++i) {
for (j = 0; j < COLS; ++j) {
array[i][j] = i*COLS+j;
}
}
}
void shuffle(int array[][COLS])
{
int i, irnd1, irnd2, jrnd1, jrnd2;
int temp;
srand((unsigned int) time(NULL));
for (i = 0; i < NTIMES; ++i) {
irnd1 = rand()%ROWS;
jrnd1 = rand()%COLS;
irnd2 = rand()%ROWS;
jrnd2 = rand()%COLS;
temp = array[irnd1][jrnd1];
array[irnd1][jrnd1] = array[irnd2][jrnd2];
array[irnd2][jrnd2] = temp;
}
}
void print(int array[][COLS])
{
int i, j;
for (i = 0; i < ROWS; ++i) {
for (j = 0; j < COLS; ++j) {
printf("%-2d ", array[i][j]);
}
putchar('\n');
}
}
int main(void)
{
int array[ROWS][COLS] = {{0}};
generate(array);
puts("# before #");
print(array);
shuffle(array);
puts("\n# after #");
print(array);
return 0;
}
le coppie di indici casuali non sono necessariamente diverse, il che significa che potrebbe capitarti di swappare un elemento con sé stesso (cosa, in ogni caso, rimediabile) ma di sicuro in questo modo vai ad evitare un bel po' di iterazioni inutili, oltre a semplificare molto la logica.