重複の可能性:
繰り返さない乱数の生成
これが私のコードです
NSUInteger count = 10;
for (NSUInteger i = 0; i < count; ++i) {
NSLog(@"%d",NeedRandomNumberWithoutRepeat);
}
この出力は 8 7 9 2 1 4 6 3 5 0 のようになるはずです。これはランダムであり、数字を繰り返しません
重複の可能性:
繰り返さない乱数の生成
これが私のコードです
NSUInteger count = 10;
for (NSUInteger i = 0; i < count; ++i) {
NSLog(@"%d",NeedRandomNumberWithoutRepeat);
}
この出力は 8 7 9 2 1 4 6 3 5 0 のようになるはずです。これはランダムであり、数字を繰り返しません
これはうまくいくはずです:
NSUInteger count = 10;
NSMutableArray *array = [[NSMutableArray alloc]init];
for (NSUInteger i = 0; i < count; ++i) {
[array addObject:[NSNumber numberWithInt:i]];
}
NSMutableArray *copy = [array mutableCopy];
array = [[NSMutableArray alloc]init];
while ([copy count] > 0)
{
int index = arc4random() % [copy count];
id objectToMove = [copy objectAtIndex:index];
[array addObject:objectToMove];
[copy removeObjectAtIndex:index];
}
この回答は、SOの私の回答の 1 つから修正されたバージョンです。
したがって、ここで何か奇妙なことがわかるかもしれませんが、要件が似ているため、これを使用できます。
int TOTAL_NUMBER=10;
NSMutableArray *alreadyGeneratedNumbers;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification{
alreadyGeneratedNumbers=[NSMutableArray new];
}
-(int)generateRandomNumber{
int low_bound = 0;
int high_bound = TOTAL_NUMBER;
int width = high_bound - low_bound;
int randomNumber = low_bound + arc4random() % width;
return randomNumber;
}
- (IBAction)button:(id)sender {
NSMutableArray *shuffle = [[NSMutableArray alloc] initWithCapacity:1];
BOOL contains=YES;
while ([shuffle count]<1) {
NSNumber *generatedNumber=[NSNumber numberWithInt:[self generateRandomNumber]];
if (![alreadyGeneratedNumbers containsObject:generatedNumber]) {
[shuffle addObject:generatedNumber];
contains=NO;
[alreadyGeneratedNumbers addObject:generatedNumber];
}
}
NSLog(@"shuffle %@",shuffle);
NSLog(@"Next Batch");
if ([alreadyGeneratedNumbers count] >= TOTAL_NUMBER) {
NSLog(@"\nGame over, Want to play once again?");//or similar kind of thing.
[alreadyGeneratedNumbers removeAllObjects];
}
}
利用可能な数値を配列に入れ、arc4random() で計算された 0 から配列のサイズ -1 までのインデックスを取得します。数値が出てきたら、配列からそれを取り除きます。
NSMutableArray* availableNumbers=[NSMutableArray new];
for(NSUInteger i=0; i<10; i++)
{
[availableNumbers addObject: @(i)];
}
for(NSUInteger i=0; i<10; i++)
{
NSUInteger index= arc4random()%availableNumbers.count;
NSNumber* number= availableNumbers[index];
NSLog(@"%@",number);
[availableNumbers removeObjectAtIndex: index];
}
PS: 内部に 1 つの数値しかないため、最後の反復で arc4random() を訴えても意味がありません。