Здесь есть два метода: Случайный выбор и Перестановка.
Случайный выбор включает в себя получение упорядоченной колоды, сбор случайной карты и вытягивание этой карты из колоды.
В случайном порядке вы берете заказанную колоду, выбираете случайную карту и кладете эту карту поверх новой колоды, из которой вы затем вытягиваете карты напрямую.
В обоих случаях вам нужно будет сделать не более N-1 вызовов случайных чисел, где N - количество карт в колоде (когда есть только одна карта, вам не нужно звонить в ГСЧ) ). Однако в случае случайного выбора вам не нужно делать эти случайные вызовы одновременно, и не только, вам даже не нужно вызывать функцию случайного N-1 раз. Если вы в итоге наберете только 10 лучших карт, это всего лишь 10 случайных звонков. Кроме того, если вам когда-либо понадобится перестановить колоду, вы можете просто добавить карты обратно в колоду и затем вернуться к случайному выбору.
С точки зрения алгоритмической эффективности, Random Pick является очевидным превосходным выбором.
Перетасуйте колоду в любом случае.
Вот в чем дело: вы не пытаетесь выбрать случайный предмет из последовательности, вы пытаетесь перетасовать колоду карт. Работайте с абстракцией, соответствующей вашему дизайну, и отклоняйтесь от нее только тогда, когда это необходимо. Черт, я бы почти порекомендовал использовать Stack
вместо List
просто потому, что он лучше всего соответствует базовой структуре колоды карт. Но список может послужить вам лучше, если вы планируете много манипулировать колодой.
Кроме того, учтите следующее: Random Pick предполагает, что вся ваша колода перемешана. Вы не всегда можете хотеть всю свою колоду перетасовать. Вы можете явно разместить карты сверху, снизу или посередине колоды. Это будет намного сложнее, если вы попытаетесь научиться работать с алгоритмами.