Iphone 在目标c中生成唯一随机数?

Iphone 在目标c中生成唯一随机数?,iphone,objective-c,Iphone,Objective C,我想生成一个31到60之间的随机数 所以我使用了rand(),但我认为它会给一些时间相同的值,但我需要每一次它都会给我新的值 我如何才能做到这一点?重复值与随机值一致。如果不能重复值,则可以使用可能的值创建一个数组,并从该数组中随机删除一个数字,直到其为空,但这将比真正的随机数随机性小。希望这会有所帮助: int r = arc4random()%30+30; 使用arc4random(),它将提供一个良好的随机数,并且不需要种子设定 rand()将在每次运行应用程序时生成相同的序列,除非您使

我想生成一个31到60之间的随机数

所以我使用了rand(),但我认为它会给一些时间相同的值,但我需要每一次它都会给我新的值


我如何才能做到这一点?

重复值与随机值一致。如果不能重复值,则可以使用可能的值创建一个数组,并从该数组中随机删除一个数字,直到其为空,但这将比真正的随机数随机性小。

希望这会有所帮助:

int r = arc4random()%30+30;
使用
arc4random()
,它将提供一个良好的随机数,并且不需要种子设定

rand()
将在每次运行应用程序时生成相同的序列,除非您使用唯一值对其进行种子设定

那就是缩小射程的问题。一个简单的解决方案是修改范围并添加范围的低端。(这将导致一个小偏差,这应该是可以接受的。)

例如:

int rangeLow = 31;
int rangeHigh = 60;
int randomNumber = arc4random() % (rangeHigh-rangeLow+1) + rangeLow;
如果您希望范围内的每个数字只出现一次,则@pawan.mangal有一个指向良好解决方案的链接。

可以使用arc4random()代替rand()

要从arc4random()中获取从0到x-1的整数值,可以执行以下操作:

int value = arc4random() % x;
要获得1到x范围内的整数,只需添加1:

int value = (arc4random() % x) + 1;
最后,如果需要生成浮点数,请在项目中定义:

#define ARC4RANDOM_MAX      0x100000000'
然后,可以使用arc4random()获得介于0和100之间的浮点值(精度是使用rand()的两倍),如下所示:

double val = floorf(((double)arc4random() / ARC4RANDOM_MAX) * 100.0f);

我想我可以添加一个我在许多项目中使用的方法

- (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))
例如


下面的方法将生成一个范围为低和高的唯一随机数数组。正如您在问题中提到的,您需要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);

    }
-(void)GeneratorDomainUniquenumberInRange:(int)rangeLow:(int)rangeHigh{
NSMutableArray*unqArray=[[NSMutableArray alloc]init];
int randNum=arc4random()%(rangeHigh-rangeLow+1)+rangeLow;
int计数器=0;

while(counter)在31到60之间有一个有限的范围,因此它肯定会在某个点重复(考虑到您需要整数)…或者只是洗牌数组。@NullUserExceptionఠ_ఠ 这将允许在删除所有值之前重复结果。
 -(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);

    }