Какой самый эффективный способ выбрать случайную карту из колоды, когда некоторые карты непригодны для использования?

У меня есть массив, который говорит, используется ли карта:

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;
 }

что, я думаю, работает лучше, если колода заполнена, но хуже, когда колода пуста, так как я должен пройти через два цикла.

Какой самый эффективный способ сделать это?

Ответы на вопрос(9)

Ваш ответ на вопрос