Какой самый эффективный способ выбрать случайную карту из колоды, когда некоторые карты непригодны для использования?
У меня есть массив, который говорит, используется ли карта:
int used[52];
Это ужасный способ выбрать случайную карту, если у меня много использованных карт:
do {
card = rand() % 52;
} while (used[card]);
поскольку, если у меня есть только 3-4 неиспользованные карты, то их поиск займет целую вечность.
Я придумал это:
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;
}
что, я думаю, работает лучше, если колода заполнена, но хуже, когда колода пуста, так как я должен пройти через два цикла.
Какой самый эффективный способ сделать это?