生成唯一编号

时间:2012-11-19 22:25:36

标签: iphone objective-c ios arrays

我正在尝试为宾果应用程序生成一个唯一的数字,现在它在1-90之间选择90个随机数并将它们添加到NSMutableSet中。这一切都有效,但我从集合中挑选的数字是唯一的,所以相同的数字被拉出两次。

这是我到目前为止所做的:

NSMutableSet * numberSet1 = [NSMutableSet setWithCapacity:90];
while ([numberSet1 count] < 90 ) {
    NSNumber * randomNumber1 = [NSNumber numberWithInt:(arc4random() % 90 + 1)];
    [numberSet1 addObject:randomNumber1];
}
//NSLog(@"numberWithSet : %@ \n\n",numberSet1);

NSArray * numbers = [numberSet1 allObjects];
//to display
int r = arc4random() % [numbers count];
if(r<[numbers count]){
    numberLabel.text = [NSString stringWithFormat:@"%@", [numbers objectAtIndex:r]];
}

如何阻止它给我重复? 提前致谢

4 个答案:

答案 0 :(得分:1)

作为使用arc4random()选择随机数的替代方法(samples with replacement,你可能不想要宾果游戏):

  1. 取一组数字1到90.
  2. Shuffle那个数组。
  3. 从数组中选择第一个数字,然后选择第二个数字,依此类推。
  4. 保留数组中当前所选元素的索引。要获取下一个数字,请增加并检查是否要取消引用第90个元素。

    一些伪代码:

    #define SIZE 90
    
    unsigned int index;
    unsigned int elements[SIZE];
    
    /* step 1 -- populate the array with elements 1 through 90 */
    for (index = 0; index < SIZE; index++)
        elements[index] = index + 1;
    
    /* step 2 -- shuffle the array */
    fisher_yates_shuffle(elements);
    
    /* step 3 -- read from the array */
    for (index = 0; index < SIZE; index++)
        fprintf(stdout, "element at index %u is %u\n", index, elements[index]);
    

答案 1 :(得分:0)

这会创建并随机播放一个数组。

// array to shuffle
NSMutableArray *array = [NSMutableArray array];
for(int i=1; i<91; i++){
    [array addObject:[NSNumber numberWithInt:i]];
}

// shuffle
for (int i = [array count]-1; i>0; i--) {
    [array exchangeObjectAtIndex:i withObjectAtIndex:arc4random()%(i+1)];
}

不确定这是否是您想要的,因为从1-90随机选取90个数字而没有重复,并将它们添加到可变集中与将所有内容添加到可变集中没有什么不同。但是如果你想要90个数字的子集,只需要从数组中获取n个元素。

答案 2 :(得分:0)

我从一个彩票应用程序中写了一段时间,也适用于此处 -

int ball[6], counter, check, similarity;
for ( counter = 1; counter <= 6; counter++ )
{
    for (;;)
    {
        similarity = 0;
        ball[counter] = 1 + arc4random() % 6;
        for (check = counter-1; check >= 1;check--)
        {
            if ( ball[check] == ball[counter] )
            {
                similarity = 1;
                break;
            }
        }
    if(similarity == 0)
        break;
    }
printf("%i\n", ball[counter]);
}

使用之前的所有球检查所选球,永远不会两次得到相同的数字。

答案 3 :(得分:0)

在NSMutableArray上创建一个类别

@implementation NSMutableArray (RandomUtils)
-(void)shuffle
{
    NSUInteger count = [self count];
    for (NSUInteger i = 0; i < count; ++i) {
        NSUInteger nElements = count - i;
        NSUInteger n = (arc4random() % nElements) + i;
        [self exchangeObjectAtIndex:i withObjectAtIndex:n];
    }
}

@end

您也可以将其包装为NSArray版本

@implementation NSArray (RandomUtils)

-(NSMutableArray *)mutableArrayShuffled
{
    NSMutableArray *array = [[self mutableCopy] autorelease];
    [array shuffle];
    return array;
}

-(NSArray *)arrayShuffled
{
    return [NSArray arrayWithArray:[self mutableArrayShuffled]];
}

@end

如果需要,请导入类别,然后执行以下操作:

NSMutableArray *array = [NSMutableArray array];
for(int i=0; i<90; i++){
    [array addObject:[NSNumber numberWithInt:i+1]];
}
[array shuffle];
NSArray *newarray = [array subarrayWithRange:NSMakeRange(0,6)];

另一种方法可能是用6个随机选择填充一组。

分类中的

@implementation NSArray (RandomUtils)
-(id)randomElement
{
    if ([self count] < 1) return nil;
    NSUInteger randomIndex = arc4random() % [self count];
    return [self objectAtIndex:randomIndex];
}
@end

使用它像:

NSMutableSet *mset = [NSMutableSet set];

while ([mset count]<6) {
    [mset addObject:[array randomElement]];
}