2012-07-20 49 views
1

我具有低于随机数可以通过它们之间的设置差距生成吗?

NSMutableSet * numberSet = [NSMutableSet setWithCapacity:10]; 
while ([numberSet count] < 10) { 
    NSNumber * randomNumber = [NSNumber numberWithInt:((arc4random() % (190-10+1)) + 10)]; 
    [numberSet addObject:randomNumber]; 
} 

这产生了一组,我使用的视图中的标绘5分10张的随机数的代码。这些点然后在他们周围绘制圆圈。

[[UIBezierPath bezierPathWithArcCenter:CGPointMake(a, b) radius:6 startAngle:1 endAngle:10 clockwise:YES] fill]; 

有没有一种简单的方法来确保数字不在彼此的某个间隙内。例如,我不想让两个圈子相互交叉。我正在考虑使用不少的陈述,但是想知道是否有更简单的方法来实现相同的目标?

感谢

回答

2

此代码生成10个半径为10的圆形,它们彼此不相交。我同意bames53最好的方法是检查生成的圆是否与先前生成的圆相交。

// Seed random generator 
srand(time(NULL)); 

const float radius = 10; 
const int numberOfCircles = 10; 

// Defines the area where the center of the circles are allowed 
const float min_x = 0 + radius; 
const float max_x = 320 - radius; 
const float min_y = 0 + radius; 
const float max_y = 367 - radius; 

NSMutableSet * nonInterSectingCircles = [NSMutableSet setWithCapacity:numberOfCircles]; 

while ([nonInterSectingCircles count] < numberOfCircles) { 

    float x_new = randomNumber(min_x, max_x); 
    float y_new = randomNumber(min_y, max_y); 

    BOOL intersectsExistingCircle = NO; 

    for (NSValue *center in nonInterSectingCircles) { 
     CGPoint centerPoint = [center CGPointValue]; 
     if (distance(x_new, centerPoint.x, y_new, centerPoint.y) < radius * 2) 
      intersectsExistingCircle = YES; 
    } 

    if (!intersectsExistingCircle) [nonInterSectingCircles addObject:[NSValue valueWithCGPoint:CGPointMake(x_new, y_new)]]; 

} 

以下功能被使用:

float distance(float x1,float x2, float y1, float y2) { 

    float dx = (x2 - x1); 
    float dy = (y2 - y1); 

    return sqrt(dx * dx + dy * dy); 
} 

float randomNumber(float min, float max) { 

    float random = ((float) rand())/(float) RAND_MAX; 
    random = random * (max - min); 
    return min + random; 

} 
1

你可能不得不跟踪到目前为止已经产生的数字,并使用这些来帮助生成每一个随机数。例如,如果您想要5的间隔,生成MIN和MAX之间的第一个数字,请将5加上,然后生成该MAX和MAX之间的下一个数字。一些额外的代码,如果你通过MAX,可以绕回到范围的开头,而且你很好。

另一种选择是将可能数字的范围分解为N个子集并在每个子范围内生成一个数字。因此,从1到100的范围内,您可以在1到10之间生成一个数字,在15到25之间生成下一个数字,在30到40之间生成下一个数字,确保分布大致均匀但保留一些随机性。

你想要使用的确切方法将取决于你实际想要达到的分配类型。

1

我认为你最好的选择是生成随机数并丢弃掉落在那些空隙中的数。如果你保留一个已排序的数字序列,并且在插入一个新数字之前,检查下一个最高和最低数字是否足够远,这可能可以合理有效地完成。

另外,您可能会考虑使用C++ <random>库,因为它为您提供的分发将可能比您生成自己的分发(假设示例代码为(arc4random() % (190-10+1)) + 10)做得更好。