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];
}
}];