Выбор случайного объекта в NSArray

Скажите, что у меня есть массив с объектами, 1, 2, 3 и 4. Как я выбрал бы случайный объект от этого массива?

82
задан Joshua 23 July 2010 в 14:08
поделиться

3 ответа

Ответ @Darryl правильный, но можно было бы внести небольшие изменения:

NSUInteger randomIndex = arc4random() % theArray.count;

Изменения:

  • Использование arc4random() вместо rand() и random() проще, поскольку не требует посева (вызов srand() или srandom()).
  • Оператор modulo (%) делает общий оператор короче, а также делает его семантически более ясным.
190
ответ дан 24 November 2019 в 09:04
поделиться

Возможно что-то вроде:

NSUInteger randomIndex = (NSUInteger)floor(random()/RAND_MAX * [theArray count]);

Не забудьте инициализировать генератор случайных чисел (например, srandomdev ()).

ПРИМЕЧАНИЕ. Я обновился, чтобы использовать -count вместо синтаксиса точки, согласно ответу ниже.

11
ответ дан 24 November 2019 в 09:04
поделиться

Сгенерировать случайное число и использовать его в качестве индекса. Пример:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        NSArray *array = [NSArray arrayWithObjects: @"one", @"two", @"three", @"four", nil];
        NSUInteger randomNumber;
        int fd = open("/dev/random", O_RDONLY);
        if (fd != -1) {
            read(fd, &randomNumber, sizeof(randomNumber));
            close(fd);
        } else {
            fprintf(stderr, "Unable to open /dev/random: %s\n", strerror(errno));
            return -1;
        }
        double scaledRandomNumber = ((double)randomNumber)/NSUIntegerMax * [array count];
        NSUInteger randomIndex = (NSUInteger)floor(scaledRandomNumber);
        NSLog(@"random element: %@", [array objectAtIndex: randomIndex]);
    }
    return 0;
}
1
ответ дан 24 November 2019 в 09:04
поделиться