Я предпочитаю делать такой случайный случайный выбор, чтобы иметь список, и каждый раз, когда я выбираю случайный элемент в диапазоне от [0-N)
, я удаляю его из этого списка. В вашем случае, когда новые элементы будут добавлены в каталог, он также будет добавлен в еще не выбранный список. Как только вы дойдете до конца, просто перезагрузите все песни обратно в список.
EDIT:
Если принять во внимание предложение v3, это можно сделать в основном через O(1)
время после шага инициализации O(N)
. Это гарантирует неповторяющийся случайный выбор.
Вот резюме:
- Добавить начальные элементы в список
- Индекс выбора
i
в случайном порядке (из набора [0,N)
)
- Удалить элемент по индексу
i
- Заменить отверстие в
i
на элемент Nth
(или ноль, если i == Nth
) и уменьшить N
- Для новых предметов просто добавьте в конец списка и при необходимости увеличьте
N
- Если вам когда-нибудь удастся воспроизвести все песни (что я сомневаюсь, если у вас есть песни 6M), то добавьте все песни обратно в список, вспените, промойте и повторите.
Поскольку вы пытаетесь работать с довольно большими наборами, я бы порекомендовал использовать БД. Простая таблица, состоящая в основном из двух полей: id
и "pointer
" (где "pointer
" - это то, что говорит вам о песне для воспроизведения, которая может быть GUID, FileName и т. Д., В зависимости от того, как вы хотите это сделать ). Имейте индекс на id
, и вы должны получить очень приличную производительность с постоянством между запусками приложения.
РЕДАКТИРОВАТЬ для предела 8 МБ:
Хм, это немного усложняет ... В 8 МБ вы можете хранить максимум ~ 2M записей с использованием 32-битных ключей.
Поэтому я бы порекомендовал предварительно выбрать следующие 2М записи. Если пользователь проигрывает 2M песен за всю жизнь, черт! Чтобы предварительно выбрать их, сделайте предварительный шаг, используя приведенный выше алгоритм. Единственное изменение, которое я хотел бы сделать, - это когда вы добавляете новые песни, бросайте кубики и смотрите, хотите ли вы случайно добавить эту песню в микс. Если да, выберите случайный индекс и замените его индексом новой песни.