1

ここでは、次のコードを使用して NSMuttable 配列をシャッフルします。シャッフル中に、配列は 1 つの値のみを繰り返し、残りはすべて正常に動作します。繰り返さずにシャッフルするには、どのような変更を加える必要がありますか?

words = [[NSMutableArray alloc] initWithObjects:@"1", @"2", @"3",@"4", nil] ;
NSUInteger count = [words count];

for (int i = 0; i < count; i++)
   {
    NSInteger nElements = count - i;
    NSInteger n = (arc4random() % nElements) + i;
    NSLog(@"n val %d i val %d",i,n);
    [words exchangeObjectAtIndex:i withObjectAtIndex:n];
   }

NSlog 出力

2012-12-31 12:49:05.730 quizer[1607:c07] n val 0 i val 0
2012-12-31 12:49:05.731 quizer[1607:c07] n val 1 i val 3
2012-12-31 12:49:05.731 quizer[1607:c07] n val 2 i val 2
2012-12-31 12:49:05.732 quizer[1607:c07] n val 3 i val 3

解決するのを手伝ってください

4

2 に答える 2

1

このコードはあなたを助けるかもしれません、

シャッフル配列には、0からTOTAL_NUMBER(配列サイズ)までの各数値が1回だけ含まれます。

そこから既存のアレイをシャッフルできます。

@synthesize alreadyGeneratedNumbers;//this is a mutableArray.


int TOTAL_NUMBER=5;//size of array


-(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)randomNumbers:(UIButton *)sender
{

    NSMutableArray *startArray=[NSMutableArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5", nil];

    NSMutableArray *shuffle = [NSMutableArray new];

    BOOL contains=YES;
    while ([shuffle count]<5) {
        NSNumber *generatedNumber=[NSNumber numberWithInt:[self generateRandomNumber]];
        //NSLog(@"->%@",generatedNumber);

        if (![alreadyGeneratedNumbers containsObject:generatedNumber]) {
            [shuffle addObject:generatedNumber];
            contains=NO;
            [alreadyGeneratedNumbers addObject:generatedNumber];
        }
    }
    if ([alreadyGeneratedNumbers count] >= TOTAL_NUMBER) {
        NSLog(@"\nOne shuffel ended.....what to reshuffle");
        [alreadyGeneratedNumbers removeAllObjects];
    }

    NSMutableArray *shuffledArray=[NSMutableArray new];
    for (NSNumber *index in shuffle) {
        [shuffledArray addObject:[startArray objectAtIndex:[index integerValue]]];
    }
    NSLog(@"Shuffled array = %@",shuffledArray);
}
于 2012-12-31T07:53:31.913 に答える
0

から重複を削除するにはNSMutableArray

// Removing duplicate entry from array
NSArray *copy = [words copy];
NSInteger index = [copy count] - 1;
for (id object in [copy reverseObjectEnumerator])
{
    if ([words indexOfObject:object inRange:NSMakeRange(0, index)] != NSNotFound)
    {
        [words removeObjectAtIndex:index];
    }
    index--;
}
[copy release];

オブジェクトを追加するたびに確認できます。

于 2012-12-31T07:26:35.683 に答える