2010-08-04 1 views
1

내부에 50-100 개의 객체가있는 NSArray가 있다고 가정 해 보겠습니다. 어떻게 배열을 임의의 순서로 넣을 수 있습니까?NSArray를 랜덤 화하는 방법은 무엇입니까?

+0

내가 광범위하게 검색하여 중복 스레드를 찾을 수 없었기 때문에이 질문을 제출 한 이유는 그 이유입니다. 링크 주셔서 감사합니다! –

답변

14

방법에는 여러 가지가 있지만 대부분은 단순히 난수 생성과 관련됩니다. 아마도 당신이있는 NSMutableArray를 사용하여이 기술을 사용할 수 있습니다

  1. 는 어떤 수는
  2. 1 사이의 난수를 생성 생성
  3. 스왑 요소 0을 (50 개 요소를 가정) 0에서 49 사이의 난수를 생성 당신이

을 생성 어떤 수를 49 개

  • 스왑 요소 1은 아마도 가장이 될 것이라고 효율적인 방법.

    샘플 코드 (테스트하지) : 또한

    srandom(time(NULL)); 
    for (NSInteger x = 0; x < [array count]; x++) { 
        NSInteger randInt = (random() % ([array count] - x)) + x; 
        [array exchangeObjectAtIndex:x withObjectAtIndex:randInt]; 
    } 
    

    , 당신은 무작위로 하나를 선택, 첫 번째 개체가 동안을 통해이있는 NSMutableArray 개체, 단순히 루프를 사용하고, 기타의 말미에 추가 할 수 있습니다 하나. 장소 방법은 아마 더 빠릅니다.

  • +3

    arc4random()을 사용하는 것이 훨씬 낫습니다! – nonamelive

    +0

    이것은 Fisher-Yates 알고리즘의 버전입니다. http://en.wikipedia.org/wiki/Fisher-Yates_shuffle – JeremyP

    +0

    is arc4random slower? – wahkiz

    -3
    NSArray *test = [NSArray arrayWithObjects:@"AA",@"BC",@"DE",@"EG",@"FA",@"GQ",@"DA"];<br> 
    NSSet *testset = [NSSet setWithArray:test]; 
    NSArray *randomorder = [testset allObjects]; 
    NSLog(@"random : %@",randomorder);<br><br> 
    

    분명히 NSSet에 대한 색인이 없습니다. 따라서 NSArray 객체는 NSSet으로 변환 될 때 뒤죽박죽이 될 수 있습니다. 그것은 해킹 솔루션이지만 작동합니다 (이것에 대해서는 확실하지 않습니다).

    +1

    집합에 중복 개체를 넣으면 어떻게됩니까? –