洗牌NSArray

时间:2015-06-10 05:26:41

标签: ios8 nsarray

我得到了一个N​​SMutableArray,其中包含的对象数量相当少,从1到20不等。

当用户点击按钮时,我想选择一个随机对象并显示它。我试过改组阵列:

srandom(time(NULL));
for (NSInteger x = 0; x < [array count]; x++)     {
    NSInteger randInt = (random() % ([array count] - x)) + x;
    [array exchangeObjectAtIndex:x withObjectAtIndex:randInt];

}

然后使用arc4random()选择一个随机索引,但我得到了很多重复。 我不想删除ObjectAtIndex,因为这只会将我的数组减少到零,然后崩溃。 有没有办法重新填充具有相同对象的数组一旦达到零并重新开始?

由于

2 个答案:

答案 0 :(得分:0)

如果您只需要选择一个随机对象,则可以使用以下内容。它比实际改组阵列更有效率。

uint32_t rnd = arc4random_uniform([array count]);

MyObject *randomObject = [array objectAtIndex:rnd];

来自this answerAdam

答案 1 :(得分:0)

我设法通过执行以下操作来“解决”我的问题: 它可能很乱,但我想对此有所了解。

NSUInteger randomIndex = arc4random()% [_someArray count];

    if (array.count == 0) { //check if array is empty and add the randomIndex
        [array addObject:@(randomIndex)];
        randomTitle = [[_someArray objectAtIndex:randomIndex] myText];

        // NSLog(@"array is empty");
        // NSLog(@"my array content %@", array);
    }

    else if (array.count > 0 && array.count < _someArray.count) {//check if array has already an object and check if this is unique and add it to the array. if not run the loop again.

          NSLog(@"array is betwen 0 and _someArray.count");

        if([array indexOfObject:@(randomIndex)] == NSNotFound) {
            [array addObject:@(randomIndex)];
       randomTitle = [[_someArray objectAtIndex:randomIndex] myText];

          //  NSLog(@"unique number in array");
        }

        else {

            [self loopBackTheAction];

            // NSLog(@"number is alreday in array");
        }
    }

   else if (array.count == _someArray.count) {//check if the array is full and empty it. run the loop again.

       [array removeAllObjects];
       [self loopBackTheAction];

       //  NSLog(@"array is full running again the loop");
    }