1

我有

for (int i = 0; i< 10; i++) {
    CGFloat longerA = ((arc4random() % 80) - 40) / 100.0f;
    NSLog(@"%f",longerA);
}

结果是

2013-09-20 11:41:30.801 ****[7025:a0b] 0.390000
2013-09-20 11:41:30.801 ****[7025:a0b] 0.080000
2013-09-20 11:41:30.801 ****[7025:a0b] 0.380000
2013-09-20 11:41:30.801 ****[7025:a0b] 42949672.000000
2013-09-20 11:41:30.802 ****[7025:a0b] 0.060000
2013-09-20 11:41:30.802 ****[7025:a0b] 0.080000
2013-09-20 11:41:30.802 ****[7025:a0b] 0.290000
2013-09-20 11:41:30.802 ****[7025:a0b] 42949672.000000
2013-09-20 11:41:30.803 ****[7025:a0b] 0.350000
2013-09-20 11:41:30.803 ****[7025:a0b] 0.180000

我只是不明白为什么会有结果 42949672.000000

请解释我为什么会这样

正如我“理解”的那样,它必须采用 random(80) - 40 和 result / 100.0f 所以我只是不明白这个 (arc4random() % 80) 怎么可能超过 79。

4

2 回答 2

2

arc4random返回无符号整数,不能低于 0。减去 40 将下溢并环绕到接近最大值的值。

您的函数中也存在模偏差(某些值会比其他值更常见)。arc4random_uniform(80)通过使用而不是做来纠正这一点% 80。因此正确的解决方案是:

for (int i = 0; i< 10; i++) {
    CGFloat longerA = (((int)arc4random_uniform(80)) - 40) / 100.0f;
    NSLog(@"%f",longerA);
}
于 2013-09-20T09:11:23.110 回答
0

arc4random函数被记录为 return 和u_int32_t. 这听起来像一个无符号类型,所以当你滚动一个小于 40 的数字然后减去 40 时,你会得到一个算术下溢。这就是大数字的来源(2 ^ 32 – 一些东西)。

于 2013-09-20T08:58:26.583 回答