f ((Mazo[h] == Espadas[aleatorio]) || (Mazo[h] == Treboles[aleatorio]) ||
(Mazo[h] == Corazones[aleatorio]) || (Mazo[h] == Cocos[aleatorio]))
{
a = false;
h = j - 1;
}
En esa sección de código, estás comprobando que la nueva carta aleatoria que has elegido aleatoriamente no está ya en el mazo. Si ya está, vuelves a calcular aleatoriamente otra carta.
Piensa que cuando queden pocas cartas, por ejemplo, 1, la posibilidad de que elijas una carta que no esté en el mazo es de 1/52, es decir, que es muy seguro que esté mucho tiempo repitiendo la elección de carta hasta que elija justo la que le falta por tomar.
Yo lo haría introduciendo todas las cartas en un List como números (1-13 espadas, 14-17 tréboles, ....). Escogería un número aleatorio entre 0 y la longitud de la lista, y quitaría ese elemento, que sería la carta elegida. Todo esto en un bucle while la longitud de la lista sea superior a 0.
Es una idea. Prueba la que mejor se ajuste a tus necesidades.
Un saludo.
Luis Javier López Arredondo