我有超过100个字符串的NSArray 我想随机选择4个不同的字符串。我可以使用for / while循环编写传统的代码方式并完成任务。
但是有没有更好的方法来挑选4个不同的随机字符串?
答案 0 :(得分:4)
如JEFF LAMARCHE's blog中所述洗牌数组并使用前四项
答案 1 :(得分:2)
从NSArray创建一个NSSet并获取前4个元素。
答案 2 :(得分:0)
论坛已经多次回答过这个问题。您生成随机数的关键是
(arc4random() % 100) +1
以上代码能够生成1到100之间的随机数。您可以使用它来获得您想要的。如果您收到了已有的随机数,请忽略并再次拨打以获取唯一的随机数。
答案 3 :(得分:0)
我写了一些utils as category on NSArray。
您可以像这样使用它:
#import "NSArray+RandomUtils.h"
NSArray *array = [NSArray arrayWithObjects:@"aa", @"ab",@"c",@"ad",@"dd", nil];
NSSet *set = [array setWithRandomElementsSize:4];
这将为您提供一组4个独特的随机元素。
如果您想让对象多次出现在您的收藏中,您可以这样做:
NSArray *array = [NSArray arrayWithObjects:@"aa", @"ab",@"c",@"ad",@"dd", nil];
NSArray *resultArray = [array arrayWithRandomElementsSize:4];
#import "NSArray+RandomUtils.h"
@implementation NSArray (RandomUtils)
-(NSMutableArray *)mutableArrayShuffled
{
NSMutableArray *array = [[self mutableCopy] autorelease];
[array shuffle];
return array;
}
-(NSMutableArray *)arrayShuffled
{
return [NSArray arrayWithArray:[self mutableArrayShuffled]];
}
-(id)randomElement
{
if ([self count] < 1) return nil;
NSUInteger randomIndex = arc4random() % [self count];
return [self objectAtIndex:randomIndex];
}
-(NSSet *)setWithRandomElementsSize:(NSUInteger)size
{
if ([self count]<1) return nil;
if (size > [self count])
[NSException raise:@"NSArrayNotEnoughElements"
format:@"NSArray's size (%d) is too small to fill a random set with size %d", [self count], size];
NSMutableSet *set = [NSMutableSet set];
NSMutableArray *array = [self mutableArrayShuffled];
if (size == [array count])
return [NSSet setWithArray:array];
while ([set count]< size) {
id object = [array objectAtIndex:0];
[array removeObjectAtIndex:0];
[set addObject:object];
}
return [NSSet setWithSet:set];
}
-(NSArray *)arrayWithRandomElementsSize:(NSUInteger)size
{
if ([self count]<1) return nil;
NSMutableArray *array = [NSMutableArray array];
while ([array count] < size) {
[array addObject:[self randomElement]];
}
return [NSArray arrayWithArray:array];
}
@end
@implementation NSMutableArray (RandomUtils)
-(void)shuffle
{
NSUInteger count = [self count];
for (NSUInteger i = 0; i < count; ++i) {
NSUInteger nElements = count - i;
NSUInteger n = (arc4random() % nElements) + i;
[self exchangeObjectAtIndex:i withObjectAtIndex:n];
}
}
@end