NSMutableArray, хранящий int без дубликатов

Я пытаюсь создать NSMutableArray в Xcode 5, где я случайным образом генерирую число от 1 до 12 и сохраняю их как целые числа. Проблема в том, что иногда одно и то же число генерируется дважды, что нежелательно.

//Load array
NSMutableArray *theSequence = [[NSMutableArray alloc] init];

//Generate the Sequence
for (NSInteger i=0; i < difficultyLevel; i++) {
    int r = arc4random()%12 + 1;

    //Check here if duplicate exists
    [theSequence addObject:[NSNumber numberWithInteger:r]];
}

Где уровень сложности в настоящее время равен 4, так как должно быть сохранено 4 целых числа.

Я безуспешно пробовал другие ответы на переполнение стека, сможет ли кто-нибудь настроить какой-то цикл перед [theSequence addObject:..], чтобы, когда я показываю числа в метке, они были уникальными? Заранее спасибо!

Гарри


person Xaser3    schedule 09.02.2014    source источник
comment
К вашему сведению, вы вводите предвзятость по модулю с arc4random()%12. arc4random_uniform(12) - лучшая альтернатива. См. здесь.   -  person Manny    schedule 09.02.2014


Ответы (1)


Поскольку порядок int не имеет значения (они в любом случае случайны), замена контейнера NSMutableArray на NSMutableSet позволит избежать дублирования. Все, что вам нужно сделать сейчас, это проверить размер контейнера и остановиться, когда вы достигнете желаемого размера, равного четырем:

NSMutableSet *theSequence = [NSMutableSet set];

do {
    int r = arc4random()%12 + 1;
    [theSequence addObject:[NSNumber numberWithInteger:r]];
} while (theSequence.count != difficultyLevel);

Примечание. Если по какой-то причине порядок вставки важен, вы можете использовать NSMutableOrderedSet.

person Sergey Kalinichenko    schedule 09.02.2014
comment
Если порядок имеет значение, ОП может просто использовать NSMutableOrderedSet кстати. - person David Ganster; 09.02.2014
comment
@David Спасибо, Дэвид! Это очень хороший комментарий. - person Sergey Kalinichenko; 09.02.2014
comment
@dasblinkenlight Работает как шарм, ты абсолютная звезда! :) - person Xaser3; 09.02.2014