Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 生成唯一编号_Iphone_Objective C_Ios_Arrays - Fatal编程技术网

Iphone 生成唯一编号

Iphone 生成唯一编号,iphone,objective-c,ios,arrays,Iphone,Objective C,Ios,Arrays,我正在尝试为bingo应用程序生成一个唯一的数字,现在它选择1-90之间的90个随机数,并将它们添加到NSMutableSet。这一切都是可行的,但我从集合中选择的数字是唯一的,因此相同的数字会被提取两次 以下是我到目前为止的情况: NSMutableSet * numberSet1 = [NSMutableSet setWithCapacity:90]; while ([numberSet1 count] < 90 ) { NSNumber * randomNumber1 = [

我正在尝试为bingo应用程序生成一个唯一的数字,现在它选择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]];
}
NSMutableSet*numberSet1=[NSMutableSet setWithCapacity:90];
而([numberSet1计数]<90){
NSNumber*randomNumber1=[NSNumber numberWithInt:(arc4random()%90+1)];
[numberSet1 addObject:randomNumber1];
}
//NSLog(@“numberWithSet:%@\n\n”,numberSet1);
NSArray*编号=[numberSet1 allObjects];
//显示
int r=arc4random()%[数字计数];

如果(r作为使用
arc4random()
拾取随机数的替代方法(这可能是宾果游戏中不需要的):

  • 取一个数字1到90的数组
  • 那个阵列
  • 从数组中选择第一个数字,然后选择第二个,依此类推
  • 保留数组中当前选定元素的索引。若要获取下一个数字,请递增并检查是否取消引用第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]);
    
    #定义尺寸90
    无符号整数索引;
    无符号整数元素[大小];
    /*步骤1——用元素1到90填充数组*/
    对于(索引=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)];
    }
    
    //要洗牌的数组
    NSMutableArray*数组=[NSMutableArray];
    对于(int i=1;i0;i--){
    [数组交换对象索引:i与对象索引:arc4random()%(i+1)];
    }
    

    不确定这是否是您想要的,因为从1-90中随机选取90个数字,没有重复项,并将其添加到可变集合与将所有内容添加到可变集合没有区别。但是,如果您想要90个数字的子集,只需从数组中提取多达n个元素。

    来自我不久前编写的彩票应用程序,也适用于这里-

    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]);
    }
    
    int-ball[6],计数器,检查,相似性;
    对于(计数器=1;计数器=1;检查--)
    {
    如果(球[检查]==球[计数器])
    {
    相似性=1;
    打破
    }
    }
    如果(相似性==0)
    打破
    }
    printf(“%i\n”,ball[计数器]);
    }
    

    将所选的球与之前的所有球进行检查,将永远不会得到相同的数字两次。

    在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
    
    需要时,导入类别,并执行以下操作:

    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)];
    
    NSMutableArray*array=[NSMutableArray];
    
    对于(int i=0;该代码似乎创建了一个数组,其中数字1-90以随机顺序排列,没有重复。您希望它做什么,它实际上在做什么?@rmaddy当我尝试在标签中显示数字时,它会给我重复的数字,我使用以下命令来显示int r=arc4random()%[numbers count];如果(为什么你要创建一个随机数字列表,然后从随机数组中获取一个随机元素?创建一个随机列表,然后按照从索引0到索引89的数组顺序获取它们。可能重复:同样,不应该从Objective-C开始的人。从Java开始。你不会创建那个“杀手应用程序”很快从Objective-C开始,你就永远学不到基础知识了。谢谢Alex,我有点笨。你能给我一个从第三点开始的开头吗?投票失败有什么原因吗?
    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)];
    
    @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]];
    }