2013-12-22 2 views
0

У меня есть массив имена и массив номера.Генерировать случайный индекс, который не генерируется снова

Мой Person класс имеет свойство для обоих имени и числа. Я хочу назначить случайные значения случайным людям.

Предположим, у меня есть массив с строк@"mary" , @"Jack" and @"ABhraham" и другой массив с номерами122, 378, 987, я хочу, чтобы назначить их значения случайным образом. Я использовал метод arc4random(), но он иногда возвращает то же значение снова.

+0

@Reformer Нет, это не тот, который ищет methi1999 (хотя название говорит о том, что он есть). Он действительно ищет FY-shuffle. – dasblinkenlight

+0

Являются ли ваши массивы размером 10, 100, 1000? Затем вы можете использовать более грубый метод, например, цикл, который пытается назначить, если он уже не назначен. Преимущество в том, что вам не нужно читать в FY, и вы можете продолжить свой проект. Недостатком является то, что вы пропускаете изучение чего-то крутого. – danh

ответ

1

1: Используйте словари, установите ключи для каждого человека.

ИЛИ

2: Используйте изменяемые массивы для обоих, удаление каждого объекта, как вы назначаете его.

while(arrayOfNumberTags.count>0){ 
    float randomIndex = arc4random() % arrayOfNumberTags.count; 
    int tagForPerson = [arrayOfNumberTags objectAtIndex:randomIndex]; 
    //Create the Person object with the tag and any person 
    [arrayOfNumberTags removeObjectAtIndex:randomIndex]; 

} 
2

Использование Fisher–Yates shuffle. Создайте массив с нулевыми номерами N-1 включительно, где N - количество элементов в ваших массивах; это будет массив индексов. Затем примените Shisher к Fisher-Yates в массив индексов. Теперь вы можете использовать number[index[i]] для каждого name[i].

Адрес link to an answer that provides a Fisher-Yates Shuffle implementation in Objective-C.

Смежные вопросы