我想生成一个介于31到60之间的随机数。
所以我使用了rand(),但我认为它会给出一些时间相同的价值。但我需要时间它应该给我新的价值。
我该怎么做?
答案 0 :(得分:8)
使用arc4random()
,它会提供一个好的随机数,不需要播种。
rand()
都会生成相同的序列,除非您使用唯一值对其进行播种。
然后是一个问题或减少范围。一个简单的解决方案是修改范围并添加范围的低端。 (这会导致一个小的偏见,这是可以接受的。)
示例:
int rangeLow = 31;
int rangeHigh = 60;
int randomNumber = arc4random() % (rangeHigh-rangeLow+1) + rangeLow;
如果您希望范围内的每个数字只出现一次,那么@ pawan.mangal会链接到一个好的解决方案。
答案 1 :(得分:4)
您可以使用arc4random()
代替rand()要从arc4random()获取一个从0到x-1的整数值,你可以这样做:
int value = arc4random() % x;
要获得1到x范围内的整数,只需添加1:
int value = (arc4random() % x) + 1;
最后,如果需要生成浮点数,请在项目中定义:
#define ARC4RANDOM_MAX 0x100000000'
然后,您可以使用arc4random()来获取浮点值(使用rand()的精度的两倍),介于0和100之间,如下所示:
double val = floorf(((double)arc4random() / ARC4RANDOM_MAX) * 100.0f);
答案 2 :(得分:3)
以下方法将生成一个范围低和高的唯一随机数数组。如您在问题中提到的,您需要31到60之间的随机数,因此数组中最多有29个唯一数字。
-(void)generateRandomUniqueNumberInRange :(int)rangeLow :(int)rangeHigh{
NSMutableArray *unqArray=[[NSMutableArray alloc] init];
int randNum = arc4random() % (rangeHigh-rangeLow+1) + rangeLow;
int counter=0;
while (counter<rangeHigh-rangeLow) {
if (![unqArray containsObject:[NSNumber numberWithInt:randNum]]) {
[unqArray addObject:[NSNumber numberWithInt:randNum]];
counter++;
}else{
randNum = arc4random() % (rangeHigh-rangeLow+1) + rangeLow;
}
}
NSLog(@"UNIQUE ARRAY %@",unqArray);
}
答案 3 :(得分:1)
重复值与随机一致。如果不能重复值,可以使用可能的值创建一个数组,并从该数组中随机删除一个数字,直到它为空,但这不会比真正的随机数更随机。
答案 4 :(得分:1)
希望,这会有所帮助:
int r = arc4random()%30+30;
答案 5 :(得分:0)
以为我可以添加一个我在许多项目中使用的方法。
- (NSInteger)randomValueBetween:(NSInteger)min and:(NSInteger)max {
return (NSInteger)(min + arc4random_uniform(max + 1);
}
如果我最终在许多文件中使用它,我通常会将宏声明为
#define RAND_FROM_TO(min,max) (min + arc4random_uniform(max + 1))
E.g。
NSInteger myInteger = RAND_FROM_TO(31,60) // 31, 32,..., 59, 60