jaki jest najskuteczniejszy sposób wybrania losowej karty z talii, gdy niektóre karty są bezużyteczne?

Mam tablicę informującą, czy karta jest używana:

int used[52];

To okropny sposób na wybranie losowej karty, jeśli mam wiele używanych kart:

do {
  card = rand() % 52;
} while (used[card]);

ponieważ jeśli mam tylko 3-4 niewykorzystane karty, znalezienie ich zajmie wieczność.

Wymyśliłem to:

 int card;
 int k = 0;
 int numUsed = 0;
 for (k=0; k < 52; ++k) {
   if (used[k]) numUsed += 1;
 }
 if (numUsed == 52) return -1;
 card = rand() % (52 - numUsed);

 for (k=0; k < 52; ++k) {
   if (used[k]) continue;
   if (card == 0) return k;
   card -= 1;
 }

co chyba działa lepiej, jeśli talia jest pełna, ale działa gorzej, gdy talia jest pusta, ponieważ muszę przejść przez dwie pętle.

Jaki jest najbardziej skuteczny sposób, aby to zrobić?

questionAnswers(9)

yourAnswerToTheQuestion