时间:2010-07-23 14:08:50

标签: objective-c cocoa

8 个答案:

答案 0 :(得分:186)

答案 1 :(得分:17)

这是我能提出的最简单的解决方案:

id object = array.count == 0 ? nil : array[arc4random_uniform(array.count)];

有必要检查count,因为非nil但空NSArray0返回countarc4random_uniform(0)会返回0 {1}}。因此,如果没有检查,您将超出阵列的界限。

此解决方案很诱人,但错误,因为它会导致空数组崩溃:

id object = array[arc4random_uniform(array.count)];

供参考,这是documentation

u_int32_t
arc4random_uniform(u_int32_t upper_bound);

arc4random_uniform() will return a uniformly distributed random number less than upper_bound.

arc4random_uniform作为0传递时,该手册页未提及0返回upper_bound

此外,arc4random_uniform中定义了<stdlib.h>,但在我的iOS测试计划中不需要添加#import

答案 2 :(得分:11)

答案 3 :(得分:9)

@interface NSArray<ObjectType>  (Random)
- (nullable ObjectType)randomObject;
@end

@implementation NSArray (Random)

- (nullable id)randomObject
{
    id randomObject = [self count] ? self[arc4random_uniform((u_int32_t)[self count])] : nil;
    return randomObject;
}

@end

编辑:更新了Xcode 7.泛型,可空性

答案 4 :(得分:1)

答案 5 :(得分:0)

 srand([[NSDate date]  timeIntervalSince1970]);

 int inx =rand()%[array count];

inx是随机数。

其中srand()可以在随机选择函数之前位于程序的任何位置。

答案 6 :(得分:0)

ObjectType *objectVarName = [array objectAtIndex:arc4random_uniform((int)(array.count - 1))];

如果你想将它强制转换为int,那么这就解决了这个问题(对于你需要一个非连续数字数组的随机int,在随机化枚举调用的情况下,等等)很有用)

int intVarName = (int)[(NSNumber *)[array objectAtIndex:arc4random_uniform((int)(array.count - 1))] integerValue];

答案 7 :(得分:0)

在Swift 4中:

let array = ["one","two","three","four"]
let randomNumber = arc4random_uniform(UInt32(array.count))

array[Int(randomNumber)]