早上好,我试图生成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])
答案 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