如何生成最多4个随机值,但总共16次,但重复次数不超过4次

时间:2015-01-15 06:06:32

标签: ios objective-c

我在iOS上制作记忆游戏。有一个4x4网格,我想知道如何生成不大于4的随机数的逻辑。这些数字将分配给16网格的4x4个单元格。但是当我应用随机数的函数时,它生成让我们说2 6次,但是在4x4网格中我希望它生成一个最多4次的数字。我是这样做的:

for (int i=0; i<16; i++) {
        int r = arc4random() % 4;
        NSLog(@"r = %d at i = %d",r,i);
    }

但它产生一个数字超过4次。还有一个问题我刚刚发现有一个数字永远不会发生,说0发生4次,2发生8次,3发生4次,所以1将被跳过。请解决这个问题。

2 个答案:

答案 0 :(得分:4)

您不希望每个4允许超过1 .. 4。不过,您想要填充4x4网格,这意味着每个数字必须4。否则,假设您的数字少于16。我建议你做的是创建一个数组,其中包含每个数字中的四个shuffle it using this answer并正确放置数字。

答案 1 :(得分:1)

您可以使用此解决方案生成1到4之间的随机数,该数字不超过每个数字的4倍

//create the property to add the integers
@property (nonatomic, strong) NSMutableArray *myArray;

- (void)generateMyRandomArray {
    _myArray = [[NSMutableArray alloc] init];
    for (int i=0; i<16; i++) {
        NSInteger r = [self randomNumber];
        [self validateIfNumberExist:r];
    }

    NSLog(@"my Array = %@", self.myArray); // this is resulted array between 1..4 each 4 times
    NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:nil ascending:YES];
    NSArray *result =[self.myArray sortedArrayUsingDescriptors:@[sort]];
    NSLog(@"Result Array = %@", result); //just to check 
}

- (void)validateIfNumberExist:(NSInteger)number {
    if ([self.myArray count] > 0) {
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF == %d", number];
        NSArray *resultArray = [self.myArray filteredArrayUsingPredicate:predicate];
        if ([resultArray count] < 4) {
             [self.myArray addObject:@(number)];
        } else {
            [self validateIfNumberExist:[self randomNumber]];
        }
    } else {
        [self.myArray addObject:@(number)];
    }
}

- (NSInteger)randomNumber {
    return 1 + arc4random_uniform(4);
}