2014-12-14 5 views
0

arc4random_uniform() 메서드를 사용하여 배열에서 요소를 가져올 때 배열과 동일한 요소가 두 번 이상 표시되는 경우가 많습니다. 배열에있는 각 요소를 한 번만 가져올 수 있도록 노력하고 있습니다. 내가 이것을하려고하는 이유는 하나의 셀이 같은 텍스트를 가지고 있지 않기 때문이다.동일한 요소를 두 번 이상 잡지 않고 배열에서 무작위 요소를 잡는 방법?

viewDidLoad() 방법에서
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"] 

, 내가 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의 세포의 텍스트의 배열이다 두 요소가 내 UITableView에 두 번 표시되지 않습니까? 고맙습니다!

+0

배열을 무작위로 정렬 하시겠습니까? –

+0

찾고있는 것은 "랜덤 셔플 (random shuffle)"또는 "임의 순열 (random permutation)"입니다. [Fisher-Yates shuffle] (http://en.wikipedia.org/wiki/Fisher-Yates_shuffle)은 가능한 구현 중 하나입니다. –

답변

0

임의 색인 값의 목록을 유지하고 후속 임의 색인이 해당 목록에 있으면이를 건너 뛰고 다른 임의 색인을 생성하십시오.

+1

마지막으로 매우 비효율적으로되는 모든 요소를 ​​얻으려면이 방법이 최선의 방법은 아닙니다. – pjs

+0

동의. 대안은 n 개의 요소가있는 링크 된 목록을 사용하는 것입니다. 임의의 인덱스 i, 1 <= i <= n (1 오프셋을 가정 함)을 생성하고, 값을 가져와 목록에서 항목을 제거하고 (목록이 이제 n-1 요소가 됨) 다시 한 번 1과 n-1 사이의 임의 색인 i. 또는 그 주제에 약간 변이. – mbmast

+0

더 나은 대안은 값 집합을 섞어서 셔플 된 집합을 반복하거나 (전체 집합을 얻으려면) [Floyd의 고유 한 하위 집합 알고리즘] (http://stackoverflow.com/questions/27157311/randomly-skip)을 사용하는 것입니다. -x-percentage-of-word-from-java-iterator/27160949 # 27160949)를 사용하십시오. – pjs