Objective c 为什么arc4random()中出现意外结果%n?

Objective c 为什么arc4random()中出现意外结果%n?,objective-c,arc4random,underflow,Objective C,Arc4random,Underflow,我有 我只是不明白为什么会有结果42949672.000000 请解释一下为什么会发生这种情况 我“理解” 它必须取random(80)-40和result/100.0f,所以我不明白这个(arc4random()%80)怎么会超过79。记录了arc4random函数的返回和u int32\u t。这听起来像一个无符号类型,所以当你滚动一个小于40的数字,然后减去40,你会得到一个。这就是大数字的来源(2^32–一些)。arc4random返回无符号整数,不能小于0。减去40将下溢,并使其接近最

我有

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

请解释一下为什么会发生这种情况

我“理解”
它必须取random(80)-40和result/100.0f,所以我不明白这个(arc4random()%80)怎么会超过79。

记录了
arc4random
函数的返回和
u int32\u t
。这听起来像一个无符号类型,所以当你滚动一个小于40的数字,然后减去40,你会得到一个。这就是大数字的来源(2^32–一些)。

arc4random返回无符号整数,不能小于0。减去40将下溢,并使其接近最大值

您的函数中也有(某些值比其他值更常见)。请使用
arc4random_uniform(80)
而不是执行
%80
来更正此问题。因此,正确的解决方案是:

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
for(int i=0;i<10;i++){
CGFloat longerA=((int)arc4random_uniform(80))-40)/100.0f;
NSLog(@“%f”,longerA);
}

谢谢你的回答,我现在就从这里开始。当我真的得到这个答案时,我会将其标记为已回答。据我所知,我的类型不支持<0的数字,所以它会告诉我一个错误?当结果<0?基本上是。阅读有关有符号和无符号数字类型以及算术溢出和下溢的内容。谢谢你的回答,但我不喜欢使用强制转换。而且我已经重新制作了这一行,比如CGFloat longerA=(arc4random()%80)/100.0f-0.4f;然后你仍然保留模偏差。介于0和16之间的值将是逗号17-79的两倍。使用arc4random_uniform代替%80。我已读取模偏差。但是为什么0-16比17-79更为普通呢?据我所知,我会有一些不是1/80而是1/80+一些非常小的值的数字。在u_int32_t中的Max rand有点大。但你是对的,我也必须避免这种低可能性。
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
for (int i = 0; i< 10; i++) {
    CGFloat longerA = (((int)arc4random_uniform(80)) - 40) / 100.0f;
    NSLog(@"%f",longerA);
}