我有一个名为getRandomCar的方法,它通过NSTimer执行4秒钟。这个方法有一个这样的数组
NSArray *cars = [NSArray arrayWithObjects:@"Mercedes", @"Opel", @"Ford", @"Mazda", nil];
这个想法是在调用getRandomCar方法时返回的值与上次返回的值不同,即
Mescedes Opel Mercedes Mazda Ford Opel etc..
不
Mercedes Mercedes Mazda Opel Opel etc...
我试过这个,但没有运气。
NSString *car = [[NSString alloc]initWithFormat:@"%@",
[carsArray objectAtIndex:arc4random() % [carsArray count]]];
if ([self.tmpCar isEqualToString:car])
{
car = [carsArray lastObject];
}
[self settmpCar:playerName];
答案 0 :(得分:1)
使用此:
NSArray *carsArray = [NSArray arrayWithObjects:@"Mercedes", @"Opel", @"Ford", @"Mazda", nil];
NSMutableString *car = [[NSMutableString alloc] init];
NSMutableString *lastCar = [[NSMutableString alloc] init];
[lastCar setString:@"XXX"];
do {
[car setString:[NSString stringWithFormat:@"%@",
[carsArray objectAtIndex:arc4random() % [carsArray count]]]];
}
while ([lastCar isEqualToString:car]);
[lastCar setString:car];
答案 1 :(得分:0)
我建议你记住最后一辆车的索引。当你生成一个随机数时,检查它是否等于前一个,如果是,则生成另一个数字。示例代码:
int test;
int lastValue;
for (int a = 0; a < 10; a++) {
test = arc4random() % 10;
if (test == lastValue) {
while (test == lastValue) {
test = arc4random();
NSLog(@"in While loop");
}
} else {
NSLog(@"%i", test);
}
lastValue = test;
}
希望有所帮助
修改强>
决定为您添加代码:
NSArray *cars = [NSArray arrayWithObjects:@"Mercedes", @"Opel", @"Ford", @"Mazda", nil];
int test;
int lastValue;
for (int a = 0; a < 20; a++) {
test = arc4random() % [cars count];
if (test == lastValue) {
while (test == lastValue) {
test = arc4random();
}
} else {
NSString *car = [cars objectAtIndex:test];
lastValue = test;
}
}
将生产20辆随机不可重复的汽车
答案 2 :(得分:0)
您可以使用另一个阵列来保存之前已经拾取过的车辆。在以下示例中,一旦耗尽整个carsArray
,方法GetCar
将返回nil
。请注意,这可能不是最有效的方法,但对于小尺寸的carsArray
,它应该可以正常工作。
在班级:
NSMutableArray *prevCars = [[NSMutableArray alloc] init];
你的方法:
-(NSString*) GetCar {
if([prevCars count] == [carsArray count])
return nil;
NSMutableString *car = [[NSMutableString alloc] init];
do {
[car setString:[NSString stringWithFormat:@"%@",
[carsArray objectAtIndex:arc4random() % [carsArray count]]]];
}
while ([InArray:prevCars value:car])
[prevCars addObject:car];
return car;
}
然后:
-(BOOL)InArray:(NSArray *)arr value:(NSString *)val {
for (id Elem in arr) {
if([val isEqualToString:(NSString*)val])
return YES;
}
return NO;
}
当然,确保在完成后释放内存。