c语言将一个数组随机打乱,iOS开发关于随机数及数组随机取元素,数组随机排序...

本文详细介绍了iOS开发中如何使用rand()、random()、arc4random()和arc4random_uniform()生成随机数,包括种子传播与范围限制。此外,涵盖了从数组中随机取元素、避免重复和排序数组的方法,如使用NSMutableSet和自定义排序算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

}

}];

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值