答案 0 :(得分:186)
答案 1 :(得分:17)
这是我能提出的最简单的解决方案:
id object = array.count == 0 ? nil : array[arc4random_uniform(array.count)];
有必要检查count
,因为非nil
但空NSArray
将0
返回count
,arc4random_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)]