我正在尝试以随机,非重复的顺序创建一个对象数组。根据建议使用NSMutableSet进行繁重的工作:How to check repetition of numbers in an array?
我在创建后将它们转储到NSArray中以访问它们,但是NSArray不会按照我将它们放在NSMutableSet中的顺序保留。让它更加混乱是因为它不一致。
我的代码:
NSArray *puzzleImages = [[NSArray alloc] initWithObjects:@"elephant.png", @"gorilla.png", @"lion.png", @"zebra.png", @"flamingo.png", @"hyena.png", @"seal.png", @"hippo.png", @"rhino.png", @"tiger.png", @"macaw.png", @"bear.png", nil];
NSArray *puzzleSounds = [[NSArray alloc] initWithObjects:@"elephant", @"gorilla", @"lion", @"zebra", @"flamingo", @"hyena", @"seal", @"hippo", @"rhino", @"tiger", @"macaw", @"bear", nil];
NSMutableSet *aImages1 = [NSMutableSet setWithCapacity:2];
NSMutableSet *aSounds1 = [NSMutableSet setWithCapacity:2];
NSMutableSet *aValues1 = [NSMutableSet setWithCapacity:2];
while([aImages1 count]<=1){
int Randnum1 = arc4random() % 11;
[aImages1 addObject:[puzzleImages objectAtIndex:Randnum1]];
[aSounds1 addObject:[puzzleSounds objectAtIndex:Randnum1]];
[aValues1 addObject:[NSNumber numberWithInt:Randnum1]];
NSLog(@"image:%@, sound:%@, value:%@",[puzzleImages objectAtIndex:Randnum1],[puzzleSounds objectAtIndex:Randnum1],[NSNumber numberWithInt:Randnum1]);
}
NSArray *arrayOfImages1 = [aImages1 allObjects];
NSLog(@"arrayOfImages1: %@",arrayOfImages1);
NSArray *arrayOfSounds1 = [aSounds1 allObjects];
NSLog(@"arrayOfSounds1: %@",arrayOfSounds1);
NSArray *arrayOfValues1 = [aValues1 allObjects];
NSLog(@"aValues1: %@",aValues1);
这是我的输出:
2010-06-20 16:13:14.572 MatchGame[22675:207] image:lion.png, sound:lion, value:2
2010-06-20 16:13:14.574 MatchGame[22675:207] image:macaw.png, sound:macaw, value:10
2010-06-20 16:13:14.575 MatchGame[22675:207] arrayOfImages1: (
"lion.png",
"macaw.png")
2010-06-20 16:13:14.575 MatchGame[22675:207] arrayOfSounds1: (
macaw,
lion)
2010-06-20 16:13:14.576 MatchGame[22675:207] aValues1: {(
2,
10)}
金刚鹦鹉的声音如何最终超过狮子声?当然它并不总是发生,但它确实打破了游戏。我确定我错过了一些愚蠢的东西,但花了足够的时间试图自己解决这个问题。
答案 0 :(得分:3)
未订购套装。特别是,您从中获取的顺序将取决于您输入的对象而不是您添加它们的顺序。 (通常使用某种对象哈希来实现它们,但我不知道这是否就是这种情况。)
由于您希望保持一组项链接,因此一个选项是创建一个包含所有项的对象类,并将其存储在集中。然后你可以把它拿出去读掉它的不同领域。
另一种选择就是加扰一个索引列表,然后按顺序访问各种原始数组中的对象。
更新:您链接的帖子正在解决您的问题。在你的情况下,使用set ordering进行随机化确实是错误的,因为排序实际上不是 random 。正确的做法是争夺单个索引数组,如下所示:
NSMutableArray *indices = [NSMutableArray arrayWithCapacity:11];
for ( int i = 0; i < 11; ++i )
[indices addObject:[NSNumber numberWithInt:i]];
for ( int i = 0; i < 11; ++i )
[indices exchangeObjectAtIndex:i withObjectAtIndex:(arc4random() % 11)];
NSLog(@"First random image: %@", [puzzleImages objectAtIndex:[[indices objectAtIndex:0] intValue]]);
等等。您对唯一性的保证来自于您从列表中的索引0..10开始然后随机播放,而不是尝试从可能产生重复的随机数生成器中召唤索引本身。
答案 1 :(得分:1)
集合没有订单 - 所以如果你想保持你添加的顺序相同,你需要使用Arrays。
同样在这种情况下,如果您在原始数组中有两个相同的项目,那么您将获得更少的元素。