Ну, вы можете создать набор возможных индексов, случайным образом выбрать один из них, удалить выбранный и получить доступ к соответствующему объекту.
В качестве альтернативы, как вы сказали, вы можете создать объединенный список и выбрать из него, удалив любой выбранный элемент.
Оба подхода потребуют некоторой инициализации, но вам все равно придется вести бухгалтерский учет.
Другой подход может заключаться в том, чтобы сохранить выбранные индексы в наборе, и после создания нового случайного индекса вы можете проверить, есть ли новый уже в «используемом» наборе. Однако, если вы хотите выбрать высокий процент от всего пула, этот подход будет все медленнее и медленнее, поскольку вы будете чаще использовать уже используемые индексы. Для выбора только нескольких из большого списка этот подход может быть лучше, так как он не требует такой большой инициализации и памяти.