美文网首页iOS 知识收集
iOS开发关于随机数及数组随机取元素,数组随机排序

iOS开发关于随机数及数组随机取元素,数组随机排序

作者: 爱吃兔兔的胡萝卜吖 | 来源:发表于2019-03-22 10:49 被阅读0次

    iOS开发关于随机数及数组随机取元素,数组随机排序

    一、随机数

    • 产生随机数的四种方法
      • rand()
      • random()
      • arc4random()
      • arc4random_uniform()
    • rand()
      • 在标准的C库中 rand() 函数可以生成 0~RAND_MAX 之间的一个随机数,其中 RAND_MAX 是 stdlib.h 中定义的一个整数,它与系统有关。
      • 因为 rand() 函数是按指定的顺序来产生整数,因此每次执行下面的语句都打印相同的两个值,所以说C语言的随机并不是真正意义上的随机,有时候也叫 伪随机数。
    printf("Random numbers are: %i %i\n",rand(),rand());
    
      • 为了使程序在每次执行时都能生成一个新序列的随机值,我们通常通过函数 srand() (来自stdlib.h) 为随机数生成器播散种子。只要种子不同 rand() 函数就会产生不同的随机数序列。
    srand((unsigned)time(0)); 
    
    • 例子
    srand((unsigned)time(0)); //不加这句每次产生的随机数不变
    int i = rand() % 5;
    
    • random()
      • random()不是一个真正的伪随机数发生器,因此在使用前必须初始化随机种子,否则每次生成的随机数都是相同的。它会产生一个[0,RAND_MAX)之间的一个整数。
      • 例子
    srandom(time(0));
    int i = random() % 5;
    
    • arc4random()
      • arc4random() 是一个真正的伪随机算法,不需要生成随机种子,因为第一次调用的时候就会自动生成。而且范围是 rand() 的两倍。在iPhone中,RAND_MAX是0x7fffffff (2147483647),而arc4random()返回的最大值则是 0x100000000 (4294967296)。
    //1. 随机整数:范围在 [0,100),包括0,不包括100
    int x = arc4random() % 100;
    
    //2. 随机整数:范围在 [from,to],包括from,包括to
    int x = arc4random() % (to - from + 1) + from;
    
    //3. 抽取方法:随机整数,范围在[from, to]
    -(int)getRandomNumber:(int)from to:(int)to
    {
      return (int)(from + (arc4random() % (to – from + 1)));
    }
    
    • arc4random_uniform()
      • 使用arc4random()产生指定的随机数还需要做取模运算,而arc4random_uniform()则不需要
    • 可产生一个[0, __upper_bound-1)的数字
    int num = arc4random_uniform(100);
    

    二、数组随机取元素

    • 第一种方法
    NSArray *array = [[NSArray alloc] initWithObjects:@"A",@"B",@"C",@"D",@"E",nil];
    NSMutableArray *randomArray = [[NSMutableArray alloc] init];
    
    while ([randomArray count] < 3) {
         int r = arc4random() % [array count];
         [randomArray addObject:[array objectAtIndex:r]];
    }
    
    • 但是有个问题就是,可能会随机出两个相同的数,甚至三个,只是可能性很小,所以我们要排除重复性,看到有从数组中先Remove的作法,但是我觉得用NSSet也不失为一种好的方法。
    NSArray *array = [[NSArray alloc] initWithObjects:@"A",@"B",@"C",@"D",@"E",nil];
    NSMutableSet *randomSet = [[NSMutableSet alloc] init];
    
    while ([randomSet count] < 3) {
        int r = arc4random() % [array count];
        [randomSet addObject:[array objectAtIndex:r]];
    }
        
    NSArray *randomArray = [randomSet allObjects];
    NSLog(@"%@",randomArray);
    

    三、随机打乱一个数组的顺序,获得一个新的数组

    • 第一种方法(比较笨)
    
    -(NSMutableArray*)getRandomArrFrome:(NSArray*)arr
    {
        NSMutableArray *newArr = [NSMutableArray new];
        while (newArr.count != arr.count) {
            //生成随机数
            int x =arc4random() % arr.count;
            id obj = arr[x];
            if (![newArr containsObject:obj]) {
                [newArr addObject:obj];
            }
        }
        return newArr;
    }
    
    
    • 第二种方法:苹果官方方法
    
        NSArray* arr = @[@"1",@"2",@"3"];
        arr = [arr sortedArrayUsingComparator:^NSComparisonResult(NSString *str1, NSString *str2) {
            int seed = arc4random_uniform(2);
            if (seed) {
                return [str1 compare:str2];
            } else {
                return [str2 compare:str1];
            }
        }];
    
    

    相关文章

      网友评论

        本文标题:iOS开发关于随机数及数组随机取元素,数组随机排序

        本文链接:https://www.haomeiwen.com/subject/gfxlvqtx.html