2012-12-31 118 views
1

这里我用下面的代码来洗牌NSMuttable阵列,而混洗阵列重复只有一个值,并保持所有正常工作,我应该做什么改变而不重复洗牌?洗牌阵列重复一个值

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 

请帮我解决

+0

你想要什么?每个值只有一次? –

+0

@AnoopVaidya是的,我想要每个值一次 –

+0

@Dev_iOS请注意,它不是数组中的值重复,它是随机数。不要指望随机数不重复,重复是随机性的一部分。 Pi的十进制表示在中间的某个地方包含'3141592653' ... – 2012-12-31 07:32:35

回答

1

此代码可以帮助你,

洗牌数组包含TOTAL_NUMBER(您的数组大小)只有一次0之间的每一个数字。

从哪里可以洗牌现有的阵列。

@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); 
} 
+0

什么是已经生成的数字包含? –

+0

最初没有。但是一旦产生一个随机数就会被推到它上面。并为下一个生成的随机数字检查该数组,如果存在,则查找anohter rnd数字。而已。 –

+0

错误终止应用程序,由于未捕获的异常'NSRangeException',原因:'*** - [__ NSArrayM objectAtIndex:]:索引4超越边界[0 .. 3]'' –

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]; 

您可以检查它每次你添加目的。

+0

'initWithObjects:@“1”,@“2”,@“3”,@“4”,nil'似乎没有创建任何重复项。 – 2012-12-31 07:30:46

+0

@Goti但它不舒服,它显示相同的'数组值1 数组值2 2,数组值3 3 数组值4' –