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ć?