выбор случайного объекта AtIndex из NSArray - PullRequest
2 голосов
/ 29 октября 2011

У меня есть NSArray, который содержит 10 объектов с индексом 0 - 9. Каждая запись в массиве является цитатой.

Когда мой пользователь выбирает опцию «случайная кавычка», я хочу иметь возможность выбрать случайную запись из массива и отобразить текст, содержащийся в этой записи.

Кто-нибудь может указать мне правильное направление, как этого достичь?

Ответы [ 4 ]

7 голосов
/ 29 октября 2011

Я бы рекомендовал вам использовать это вместо жесткого кодирования 10; таким образом, если вы добавите больше цитат, он будет работать автоматически, без необходимости менять это число.

NSInteger randomIndex = arc4random()%[array count];
NSString *quote = [array objectAtIndex:randomIndex];
1 голос
/ 29 октября 2011

Возможно, вы захотите использовать arc4random (), чтобы выбрать объект от 0 до 9. Затем просто сделайте

NSString* string = [array objectAtIndex:randomPicked];

чтобы получить текст записи.

1 голос
/ 29 октября 2011

Вы можете использовать arc4random()%10, чтобы получить индекс. Есть небольшое смещение, которое не должно быть проблемой.

Еще лучше использовать arc4random_uniform(10), нет смещения и еще проще в использовании.

0 голосов
/ 29 октября 2011

Сначала получите случайное число между вашими границами, см. это обсуждение и соответствующие справочные страницы. Затем просто индексируйте в массив с ним.

int random_number = rand()%10; // Or whatever other method.
return [quote_array objectAtIndex:random_number];

Редактировать: для тех, кто не может правильно интерполировать ссылки или просто не хочет читать предлагаемые ссылки, позвольте мне объяснить это для вас:

// Somewhere it'll be included when necessary, 
// probably the header for whatever uses it most.
#ifdef DEBUG 
#define RAND(N) (rand()%N)
#else 
#define RAND(N) (arc4random()%N)
#endif

...

// Somewhere it'll be called before RAND(), 
// either appDidLaunch:... in your application delegate 
// or the init method of whatever needs it.
#ifdef DEBUG
// Use the same seed for debugging 
// or you can get errors you have a hard time reproducing.
srand(42);
#else
// Don't seed arc4random()
#endif

....

// Wherever you need this.
NSString *getRandomString(NSArray *array) {
    #ifdef DEBUG
    // I highly suggest this, 
    // but if you don't want to put it in you don't have to.
    assert(array != nil);
    #endif
    int index = RAND([array count]);
    return [array objectAtIndex:index];
}
...