2014-12-14 1 views
0

Когда я захватываю элемент из массива с помощью метода arc4random_uniform(), тот же самый элемент массива часто захватывается более одного раза. Я пытаюсь сделать так, чтобы каждый элемент массива захватывался только один раз. Причина, по которой я пытаюсь это сделать, заключается в том, что более чем одна ячейка в UITableView не имеет одного и того же текста. Вот массив для текста ячеек в UITableView:Как захватить случайный элемент из массива без захвата одного и того же элемента более одного раза?

var definitions = ["Used to carry the pharoah","Used to carry bodies as a ceremony","Had a flat deck to carry a farmer's treasure","Daily, it made a trip around the world to carry Ra","Towed by smaller boats, carrying heavy objects","Used for business and pleasure by officials/nobles","Carried most Egyptians and some goods"] 

В моем viewDidLoad() метод, я сделал это, чтобы назвать случайные элементы из definitions:

self.boats = [Boats(name: definitions[Int(arc4random_uniform(7))]),Boats(name: definitions[Int(arc4random_uniform(7))]),Boats(name: definitions[Int(arc4random_uniform(7))]),Boats(name: definitions[Int(arc4random_uniform(7))]),Boats(name: definitions[Int(arc4random_uniform(7))]),Boats(name: definitions[Int(arc4random_uniform(7))]),Boats(name: definitions[Int(arc4random_uniform(7))])] 

Как я могу изменить мой код так два элемента не отображаются дважды в моем UITableView? Спасибо!

+0

Вы хотите случайно отсортировать массив? –

+0

То, что вы ищете, называется «случайным перетасовкой» или «случайной перестановкой». [Fisher-Yates shuffle] (http://en.wikipedia.org/wiki/Fisher-Yates_shuffle) - одна из возможных реализаций. –

ответ

0

Сохраните список значений случайных индексов и, если в этом списке находится следующий случайный индекс, пропустите его и сгенерируйте еще один случайный индекс.

+1

Это не лучший способ сделать это, если вы хотите, чтобы все элементы были очень неэффективными в конце. – pjs

+0

Согласен. Альтернативой будет использование связанного списка с n элементами. Создайте случайный индекс i, 1 <= i <= n (при условии смещения 1), возьмите значение, удалите элемент из списка (так что список теперь n-1 элементов) и сделайте это снова, на этот раз создавая случайный индекс i между 1 и n-1. Или некоторые варианты этой темы. – mbmast

+0

Лучшими альтернативами было бы перетасовать набор значений и выполнить итерацию с помощью перетасованного набора (чтобы получить весь набор) или использовать [уникальный алгоритм подмножества Floyd] (http://stackoverflow.com/questions/27157311/randomly-skip -x-percent-of-words-from-java-iterator/27160949 # 27160949), если вы хотите подмножество. – pjs