从NSArray中选择一个随机objectAtIndex

时间:2011-10-29 16:44:24

标签: iphone objective-c xcode ios4 nsarray

我有一个NSArray,它包含索引0-9中的10个对象。数组中的每个条目都是引号。

当我的用户选择“随机引用”选项时,我希望能够从数组中选择一个随机条目并显示该条目中包含的文本。

有人能指出我如何实现这个目标吗?

4 个答案:

答案 0 :(得分:7)

我建议您使用此代替硬编码10;这样,如果您添加更多报价,它将自动完成,而无需您更改该数字。

NSInteger randomIndex = arc4random()%[array count];
NSString *quote = [array objectAtIndex:randomIndex];

答案 1 :(得分:1)

你可能想要使用arc4random()从0-9中选择一个对象。然后,只需做

NSString* string = [array objectAtIndex:randomPicked];

获取条目的文本。

答案 2 :(得分:1)

您可以使用arc4random()%10获取索引。有一点不应该是一个问题。

更好地使用arc4random_uniform(10),没有偏见,甚至更容易使用。

答案 3 :(得分:0)

首先,在您的边界之间获取一个随机数,请参阅this discussion和相关的手册页。然后用它来索引数组。

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];
}