Получить n случайных объектов (например, 4) из nsarray

У меня есть большой NSArray имен, мне нужно получить случайные 4 записи (имена) из этого массива, как я могу это сделать?

Ответ 1

#include <stdlib.h>

NSArray* names = ...;
NSMutableArray* pickedNames = [NSMutableArray new];

int remaining = 4;

if (names.count >= remaining) {
    while (remaining > 0) {
       id name = names[arc4random_uniform(names.count)];

       if (![pickedNames containsObject:name]) {
           [pickedNames addObject:name];
           remaining--;
       }
    }
}

Ответ 2

Я сделал пометку NSArray+RandomSelection. Просто импортируйте эту категорию в проект, а затем просто используйте

NSArray *things = ...
...
NSArray *randomThings = [things randomSelectionWithCount:4];

Здесь реализация:

NSArray+RandomSelection.h

@interface NSArray (RandomSelection)
    - (NSArray *)randomSelectionWithCount:(NSUInteger)count;
@end

NSArray+RandomSelection.m

@implementation NSArray (RandomSelection)

- (NSArray *)randomSelectionWithCount:(NSUInteger)count {
    if ([self count] < count) {
        return nil;
    } else if ([self count] == count) {
        return self;
    }

    NSMutableSet* selection = [[NSMutableSet alloc] init];

    while ([selection count] < count) {
        id randomObject = [self objectAtIndex: arc4random() % [self count]];
        [selection addObject:randomObject];
    }

    return [selection allObjects];
}

@end

Ответ 3

Если вы предпочитаете Swift Framework, у которой есть еще несколько полезных функций, вы можете бесплатно проверить HandySwift. Вы можете добавить его в свой проект через Carthage, затем использовать его следующим образом:

import HandySwift    

let names = ["Harry", "Hermione", "Ron", "Albus", "Severus"]
names.sample() // => "Hermione"

Существует также возможность сразу получить несколько случайных элементов:

names.sample(size: 3) // => ["Ron", "Albus", "Harry"]

Надеюсь, это поможет!