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

时间:2011-11-08 12:55:09

标签: iphone objective-c

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

所以我使用了rand(),但我认为它会给出一些时间相同的价值。但我需要时间它应该给我新的价值。

我该怎么做?

6 个答案:

答案 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