生成任意18位数的随机NSInteger

时间:2014-08-29 11:47:04

标签: ios objective-c random

我试过了:

NSInteger numberFinal = 100000000000000000 + ((float)arc4random() / UINT32_MAX) * (999999999999999999 - 100000000000000000);

但它返回零...我不想指定范围,但只想要任何18位数的数字......

5 个答案:

答案 0 :(得分:6)

根据您的要求,正如@duDE所提到的,您无法使用NSInteger来保存18位数字,但有使用NSString的解决方案。

NSString *eighteenDigitNumberString = [[NSNumber numberWithInt:1 + arc4random_uniform(9)] stringValue];

for (int i = 0; i < 17; i++) {

    eighteenDigitNumberString = [eighteenDigitNumberString stringByAppendingString:[[NSNumber numberWithInt:arc4random_uniform(10)] stringValue]];
}

NSLog(@"eighteenDigitNumberString : %@", eighteenDigitNumberString);

我们走了,没有必要解释一切都是直截了当的。

已编辑:如果你真的想要一个很长的值,你可以这样做:

long long eighteenDigitNumberLongLong = [eighteenDigitNumberString longLongValue];  

已编辑:为了避免前导0,初始字符串已使用非零数字启动,并且循环仅运行17次。

答案 1 :(得分:2)

由于NSInteger的最大值为NSIntegerMax,因此无法使用NSInteger:

enum {
   NSNotFound = NSIntegerMax
};

在OS X v10.5之前,NSNotFound被定义为 0x7fffffff 。 这是 2147483647 (十进制)。

如果您需要&#34;任何数字&#34;有18位数字(如@ A-Live假设),你可以以NSFloat为例。

答案 2 :(得分:2)

18位整数将需要long long类型。

创建两个9位数的随机数,多个乘以10 ^ 9并添加到另一个。

const u_int32_t digits9 = 1000000000;
u_int32_t ms = arc4random_uniform(digits9);
u_int32_t ls = arc4random_uniform(digits9);
unsigned long long random18 = ((unsigned long long)ms * digits9) + ls;

NSLog(@"Example random18: %018llu", random18);

输出:

  

示例随机18:501895974656079554

如果号码必须有一个前导非零数字:

const u_int32_t digits81 = 100000000;
const u_int32_t digits89 = 900000000;
const u_int32_t digits9 = 1000000000;

u_int32_t ms = arc4random_uniform(digits89) + digits81;
u_int32_t ls = arc4random_uniform(digits9);
unsigned long long random18 = ((unsigned long long)ms * digits9) + ls;

答案 3 :(得分:1)

如果您需要严格的18位数字,最好使用此代码:

NSString *stringNumber = [NSString string];

for (int i = 0; i < 18; i++) {
    if (i == 0) {   
        stringNumber = [stringNumber stringByAppendingString:[NSString stringWithFormat:@"%@", @(arc4random_uniform(9) + 1)]];
    } else {
        stringNumber = [stringNumber stringByAppendingString:[NSString stringWithFormat:@"%@", @(arc4random_uniform(10))]];
    }
}

long long value = stringNumber.longLongValue;

你需要第一个条件因为0.1的可能性你可以得到0作为第一个数字,那么你的18位整数将变为17位,0.01可能性 - 16位整数等。

答案 4 :(得分:0)

你进入无条件的漫长的领域......

#define ARC4RANDOM_MAX      0x100000000

float val = ((double)arc4random() / ARC4RANDOM_MAX);
unsigned long long numberToAdd = val * (900000000000000000-1);
unsigned long long numberFinal = 100000000000000000 + numberToAdd;

NSLog( @"value = %llu", numberFinal);