Dav*_*ong 190
@Darryl的答案是正确的,但可以使用一些小调整:
NSUInteger randomIndex = arc4random() % theArray.count;
Run Code Online (Sandbox Code Playgroud)
修改:
arc4random()over rand()并且random()更简单,因为它不需要播种(调用srand()或srandom()).%)使得整体更短的语句,同时也使得它在语义上更清晰.fun*_*oll 17
这是我能想到的最简单的解决方案:
id object = array.count == 0 ? nil : array[arc4random_uniform(array.count)];
Run Code Online (Sandbox Code Playgroud)
这是必要的检查count,因为非nil却空无一人NSArray将返回0了count,和arc4random_uniform(0)回报0.所以没有检查,你将超出阵列的界限.
这个解决方案很诱人但是错误,因为它会导致空数组崩溃:
id object = array[arc4random_uniform(array.count)];
Run Code Online (Sandbox Code Playgroud)
供参考,这是文档:
u_int32_t
arc4random_uniform(u_int32_t upper_bound);
arc4random_uniform() will return a uniformly distributed random number less than upper_bound.
Run Code Online (Sandbox Code Playgroud)
手册页没有提到传递时的arc4random_uniform返回值.00upper_bound
此外,arc4random_uniform已定义<stdlib.h>,但#import在我的iOS测试程序中添加不是必需的.
Dar*_*mas 11
也许是这样的:
NSUInteger randomIndex = (NSUInteger)floor(random()/RAND_MAX * [theArray count]);
Run Code Online (Sandbox Code Playgroud)
不要忘记初始化随机数生成器(例如srandomdev()).
注意:根据下面的答案,我已更新为使用-count而不是点语法.
@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
Run Code Online (Sandbox Code Playgroud)
编辑:更新了Xcode 7.泛型,可空性
| 归档时间: |
|
| 查看次数: |
37275 次 |
| 最近记录: |