Io ho fatto adesso questo programma di esempio:
codice:
enum e_seme {
	picche = 0,
	fiori = 1,
	cuori = 2,
	quadri = 3
};

class carta
{
public:
	e_seme seme;
	unsigned int valore;
};

void mescola(carta mazzo[], int numero, int sicurezza = 500);
void mostra(carta mazzo[], int numero);

void main()
{
	carta mazzo[52];
	int i,j;

	// Inizializza i valori
	for(i=0; i<4; i++)
	{
		for(j=0; j<13; j++)
		{
			mazzo[i * 13 + j].seme = (e_seme) i;
			mazzo[i * 13 + j].valore = j + 1;
		}
	}

	mostra(mazzo,52);
	mescola(mazzo,52);

	cout << "\n\n\n\n\nMescolamento:\n\n\n\n\n\n\n";
	mostra(mazzo,52);
}

void mostra(carta mazzo[], int numero)
{
	int i;
	int p=0,f=0,c=0,q=0;
	for(i=0; i<numero; i++)
	{
		cout << "Carta numero " << mazzo[i].valore << " di seme ";

		switch(mazzo[i].seme)
		{
		case 0:
			cout << "picche";
			p++;
			break;
		case 1:
			cout << "fiori";
			f++;
			break;
		case 2:
			cout << "cuori";
			c++;
			break;
		case 3:
			cout << "quadri";
			q++;
			break;
		}

		cout << ".\n";
	}
	cout << "Totale: " << p << " picche, " << f << " fiori, " << c  << " cuori e " << q << "quadri.\n";

}

void mescola(carta mazzo[], int numero, int sicurezza)
{
	srand(numero * mazzo[0].valore * sicurezza % 30000);
	
	int i, pos1, pos2;
	carta initval;
	
	// Trovo la carta iniziale a caso
	pos1 = rand() % numero + 1;
	// Memorizzo il suo valore
	initval = mazzo[pos1];

	for(i=0; i < sicurezza; i++)
	{
		// Trovo un' altra carta a caso
		do {
			pos2 = rand() % numero + 1;
		// Diversa da quella di prima
		} while(pos2 == pos1);
		
		// Metto il valore dei questa carta nella carta di prima
		mazzo[pos1] = mazzo[pos2];
		// Ora questa è la carta 'vecchia'
		pos1 = pos2;
	}

	// Metto nell'ultima carta il valore della prima
	mazzo[pos1] = initval;
	
}