获取随机数序列'对(Objective-c)

时间:2017-03-15 08:37:41

标签: objective-c random

早上好,我试图生成N对数字序列,例如1-0,2-4,4-3。这些数字必须介于0到8之间,并且对于所有数字,这两个数字必须不同。

我不想要:1-3 1-3

我发现如果a和b是数字,(a + b)+(a-b)必须对所有数字对都不同。

所以我设法做到了,但循环永远不会结束。 你能纠正我的代码还是给我写另一个代码?我需要尽快。

NSNumber*number1;
int risultato;
int riga;
int colonna;
NSMutableArray*array=[NSMutableArray array];
NSMutableArray*righe=[NSMutableArray array];
NSMutableArray*colonne=[NSMutableArray array];

for(int i=0; i<27; i++)
{
    riga=arc4random()%9;
    colonna=arc4random()%9;
    risultato=(riga+colonna)+(riga-colonna);
    number1=[NSNumber numberWithInt:risultato];
    while([array containsObject:number1])
    {
        riga=arc4random()%9;
        colonna=arc4random()%9;
        risultato=(riga+colonna)+(riga-colonna);
        number1=[NSNumber numberWithInt:risultato];
    }

    NSNumber*row=[NSNumber numberWithBool:riga];
    NSNumber*column=[NSNumber numberWithInt:colonna];
    [righe addObject:row];
    [colonne addObject:column];
    [array addObject:number1];

}

for(int i=0; i<27; i++)
{
    NSNumber*one=[righe objectAtIndex:i];
    NSNumber*two=[colonne objectAtIndex:i];

    NSLog(@"VALUE1 %ld VALUE2 %ld", [one integerValue], (long)[two integerValue]);
}

编辑:
我有两个数组(righe,colonne),我希望它们有27个元素[0-8]。 我想获得一个类似的序列: righe:1 2 4 6 7 8 2 3 4 8 8 7 colonne:1 3 4 4 2 1 5 2 7 6 5 6 我不想拥有: righe:1 2 4 6 2 colonne:1 3 5 2 3 你看到2-3重复一次。然后我想将这些值存储在原始的2d数组中(数组[2] [27])

2 个答案:

答案 0 :(得分:0)

您对(a+b)+(a-b)的假设不正确:此公式实际上等于2*a,这显然不是您想要的。我建议将数字存储在CGPoint结构中并检查do ... while循环,如果你已经在数组中有新生成的元组:

// this array will contain objects of type NSValue,
// since you can not store CGPoint structs in NSMutableArray directly
NSMutableArray* array = [NSMutableArray array];
for(int i=0; i<27; i++) {
    // declare a new CGPoint struct
    CGPoint newPoint;
    do {
        // generate values for the CGPoint x and y fields
        newPoint = CGPointMake(arc4random_uniform(9), arc4random_uniform(9));
    } while([array indexOfObjectPassingTest:^BOOL(NSValue* _Nonnull pointValue, NSUInteger idx, BOOL * _Nonnull stop) {
        // here we retrieve CGPoint structs from the array one by one
        CGPoint point = [pointValue CGPointValue];
        // and check if one of them equals to our new point
        return CGPointEqualToPoint(point, newPoint);
    }] != NSNotFound);
    // previous while loop would regenerate CGPoint structs until
    // we have no match in the array, so now we are sure that
    // newPoint has unique values, and we can store it in the array
    [array addObject:[NSValue valueWithCGPoint:newPoint]];
}

for(int i=0; i<27; i++)
{
    NSValue* value = array[i];
    // array contains NSValue objects, so we must convert them
    // back to CGPoint structs
    CGPoint point = [value CGPointValue];
    NSInteger one = point.x;
    NSInteger two = point.y;

    NSLog(@"VALUE1 %ld VALUE2 %ld", one, two);
}

答案 1 :(得分:0)

  

我发现如果a和b是数字,(a + b)+(a-b)必须对所有数字对都不同。

这只是2 * a,不是有效的测试。

你要找的是0到8之间的数字对,总共有81种可能的组合。

考虑:用基数9写的数字(与2,10或16的公共基数相反)使用数字0 - 8,如果你表示十进制数0 - >;基数为9的80,你会得到0 - &gt; 88遍历每个数字0到8的所有组合。

鉴于您可以重申您的问题,因为需要生成0到80十进制的27个数字,没有重复,并在基数9中表示结果数字。您可以使用整数除法提取数字的“数字” (/ 9)和模数(% 9

要执行重复测试,您只需使用81个布尔值的数组:false - 未使用的数字,true - 使用的数字。对于碰撞,您可以通过阵列寻找(环绕),直到找到未使用的数字。

  

然后我想将这些值存储在原始的2d数组中(数组[2] [27])

如果是这种情况,只需将数字直接存储到这样的数组中,使用NSMutableArray毫无意义。

所以经过那么长的解释,真正的短代码:

int pairs[2][27];
bool used[81];     // for the collision testing

// set used to all false
memset(used, false, sizeof(used));

for(int ix = 0; ix < 27; ix++)
{
  // get a random number
   int candidate = arc4random_uniform(81);
   // make sure we haven't used this one yet
   while(used[candidate]) candidate = (candidate + 1) % 81;
   // record
   pairs[0][ix] = candidate / 9;
   pairs[1][ix] = candidate % 9;
   // mark as used
   used[candidate] = true;
}

HTH