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

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开发关于随机数及数组随机取元素,数组随机排序)