0

我正在尝试为宾果应用程序生成一个唯一编号,现在它在 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

4 回答 4

1

作为选择随机数的替代方法arc4random()(其中带有替换的样本,您可能不希望在宾果游戏中使用):

  1. 取一个从 1 到 90 的数组。
  2. 随机播放该数组。
  3. 从数组中选择第一个数字,然后选择第二个,依此类推。

保留数组中当前选定元素的索引。要获得下一个数字,请递增并检查您是否取消引用第 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]);
于 2012-11-19T22:36:18.040 回答
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 个元素。

于 2012-11-19T23:09:15.697 回答
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]);
}

将选中的球与之前所有的球进行核对,永远不会两次得到相同的号码。

于 2012-11-20T00:15:35.070 回答
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]];
} 
于 2012-11-20T00:30:52.370 回答