你是对的 - 它不起作用,因为这里:
if (randomValue==oldquest[j])
您正在尝试将 aint
与对象进行比较... NSArrays 只能存储对象。事实上,这条线不应该因为这个原因而工作:
[oldquest addObject: randomValue];
您需要将 int 装箱为 NSNumber 并将其存储在数组中:
NSNumber* boxedRandomValue = [NSNumber numberWithInt:randomValue];
[oldquest addObject: boxedRandomValue];
-(int)intValue
然后在比较值之前使用 NSNumber 实例方法将其拆箱:
if (randomValue==[oldquest[j] intValue])
更新
您还必须注意其他一些问题:
kk 的值在每次测试迭代中重置为 1,因此kk == 1
始终为真,else
从不调用该子句。您只需在此代码块之外设置一次(例如,您可以将其设为属性,在初始化时将其设置为 1,然后在此处访问并递增它)。更好的是,只需使用 [oldquest count] 代替:if ([oldquest count]==0) {} else {}
. 然后你就可以完全不用你的kk
柜台了。
您的 for 循环以 j=1 开头。这应该是 j=0 来寻址数组中的第一项(项 0)。
更新 2
这一行:randomValue = (arc4random() % numerodomande)+ 1
由于它在检查循环中的位置,将导致各种其他问题。尝试以下建议之一:
就return
在你遇到骗子的时候。没有数字被添加到数组中......
在循环内设置一个 BOOL 测试,在外面处理它:
BOOL repeatedValue = NO;
for (int j=0; j<[self.oldquest count]; j++){
if (randomValue==[self.oldquest[j] intValue]) {
repeatedValue = YES;
break;
}
}
if (repeatedValue){
NSLog (@"value repeated");
[self addRandom];
//recursive call to this code block,
//assuming it is a method called `addRandom`
}
尝试最后一个建议的紧凑版本(类似于 Odrakir 的解决方案) - 我已将其包含在一个addRandom
方法中,以便您可以了解如何递归调用它。
- (void) addRandom {
int numberofquest = 5;
int randomValue = (arc4random() % numberofquest)+ 1;
NSNumber* boxedValue = [NSNumber numberWithInt:randomValue];
if ([self.oldquest indexOfObject:boxedValue]==NSNotFound) {
[self.oldquest addObject: boxedValue];
} else {
[self addRandom];
}
}
(如果你一直循环直到你找到一个唯一的数字,你将不得不小心,因为你的总数字集是有限的numberofquest
,所以当你有一个完整的数字集时,你最终可能会陷入无限循环。)
您可以使用 MutableOrderedSet 而不是使用 NSMutableArray,而是使用 MutableOrderedSet - 它是唯一对象的有序集合,因此不会两次添加对象。
在@interface
@property (nonatomic, strong) NSMutableOrderedSet setOfRandoms;
在@实现中
int randomValue = (arc4random() % numberofquest)+ 1;
NSNumber randomValueBoxed = [NSNumber numberWithInt:randomValue];
[setOfRandoms addObject:randomValueBoxed];
更新 3
前面的提示假定它是您感兴趣的随机数列表。这是一个完整的解决方案,用于在自包含方法中返回一个新的唯一随机 int。
您需要在 @interface 中设置 2 个属性并在某处初始化它们:
@property (nonatomic, assign) int maxRand;
//stores the highest allowed random number
@property (nonatomic, strong) NSMutableArray* oldRands;
//stores the previously generated numbers
uniqueRandom
每次返回一个介于 1 和 self.maxRand 之间的唯一随机数。如果已返回所有允许的数字,则返回 0。
- (int) uniqueRandom {
int result = 0;
if ([self.oldRands count] != self.maxRand) {
int randomValue = (arc4random() % self.maxRand )+ 1;
NSNumber* boxedValue = [NSNumber numberWithInt:randomValue];
if ([self.oldRands indexOfObject:boxedValue]==NSNotFound) {
[self.oldRands addObject: boxedValue];
result = randomValue;
} else {
result = [self uniqueRandom];
}
}
return result;
}
您应该考虑到一旦初始化 self.maxRand 就更改它是没有意义的,除非您还重置 self.oldRands。因此,您可能想使用const
or#define
代替,和/或将其绑定到您的self.oldRands
初始化程序。