あなたは正しいです-それはここにあるので機能しません:
if (randomValue==oldquest[j])
をオブジェクトと比較しようとしint
ています...NSArrayはオブジェクトのみを格納できます。実際、この行はその理由で機能しないはずです。
[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
常にtrueであり、else
句が呼び出されることはありません。このコードブロックの外側で一度だけ設定する必要があります(たとえば、プロパティにし、初期化時に1に設定してから、ここでアクセスしてインクリメントすることができます)。さらに良いことに、代わりに[oldquest count]を使用してください:if ([oldquest count]==0) {} else {}
。その後、あなたはあなたのkk
カウンターを完全に省くことができます。
forループはj=1で始まります。配列の最初の項目(項目0)をアドレス指定するには、これをj=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
、注意する必要があります。したがって、完全なセットがある場合は、無限ループになる可能性があります。)
NSMutableArrayを使用する代わりに、代わりにMutableOrderedSetを使用できます。これは一意のオブジェクトの順序付けられたコレクションであるため、オブジェクトを2回追加することはありません。
@interfaceで
@property (nonatomic, strong) NSMutableOrderedSet setOfRandoms;
@implementationで
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.oldRandsもリセットしない限り、初期化されたself.maxRandを変更しても意味がないことを考慮する必要があります。したがって、またはの代わりにconst
またはを使用したり、イニシャライザーに関連付けたりすることができます。#define
self.oldRands