用正好18位数生成随机的NSInteger

我试过这个:

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

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

根据您的要求,正如@duDE所提到的,您不能使用NSInteger来保存18位数字,但有一个使用NSString的解决scheme。

 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,初始string已经用非零数字启动,并且循环仅运行17次。

由于NSInteger的最大值是NSIntegerMax ,因此不能使用NSInteger:

 enum { NSNotFound = NSIntegerMax }; 

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

如果您需要18位数的“任意数字”(如@ A-Live假设),则可以采用NSFloat。

一个18位的整数将需要一个长长的types。

创build两个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); 

输出:

示例random18: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; 

如果你需要严格的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位整数等

你正在进入未签名的漫长的领土…

 #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);