我试过了:
NSInteger numberFinal = 100000000000000000 + ((float)arc4random() / UINT32_MAX) * (999999999999999999 - 100000000000000000);
但它返回零...我不想指定范围,但只想要任何18位数的数字......
答案 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);