Как реализовать алгоритм частоты появления?
Ну так обычное распределение по весам. Каждый объект имеет вес. Суммируете все веса, кидаете рандом в пределах этой суммы. Далее начинаете идти по массиву, и суммировать веса. Как только просуммированный вес станет больше выданного рандомом - вот он ваш элемент.
Пример.
Три объекта, с весами 2, 1, 1. Кидаете рандом до 4. Выпадает например 3. Начинаете суммировать - сначала 2 - пропускаем первый элемент. Потом добавляем 1 - и это равно тому что выдал рандом. Возвращаем второй элемент.
Главное с пороговыми значениями не напутать.
Я бы решил эту задачу так - каждому объекту присвоил бы счетчик, который инкрементируется при показе объекта. 
Т.е. 100 объектов - 100 счетчиков. 
Далее, каждый счетчик я бы делил на приоритет его объекта и значения складывал в массив, для каждого элемента так же складывал бы и указатель на объект. 
После сортировал бы этот массив по возрастанию, и показывал объект по самой первой ссылке из отсортированного массива (при этом инкрементируя его индивидуальный счетчик). 
И так каждый раз. Таким образом получаем отображение наименее показанного объекта с учетом приоритетов минимальными усилиями и с достаточно прозрачной логикой.