arc4random抛出巨大的数字

时间:2012-12-29 20:52:20

标签: iphone objective-c cocos2d-iphone arc4random

在cocos2d游戏中,我使用arc4random生成如下随机数:

    float x = (arc4random()%10 - 5)*delta;

(delta是预定更新方法中更新之间的时间)

    NSLog(@"x: %f", x);

我一直在检查它们。

我得到的大部分数字都是这样的:

    2012-12-29 15:37:18.206 Jumpy[1924:907] x: 0.033444

    2012-12-29 15:37:18.247 Jumpy[1924:907] x: 0.033369

但由于某些原因,我有时会得到这样的数字:

    2012-12-29 15:37:18.244 Jumpy[1924:907] x: 71658664.000000

编辑:Delta几乎总是:

    2012-12-29 17:01:26.612 Jumpy[2059:907] delta: 0.016590

我认为它应该返回-5到5范围内的数字(乘以一些小数字)。为什么我得到这样的数字?

3 个答案:

答案 0 :(得分:6)

arc4random returns a u_int32_t. u_部分告诉您它未签名。所以括号内的所有运算符都使用无符号算术。

如果使用无符号32位算术执行减法2 - 5,则得到2 32 + 2 - 5 = 2 32 - 3 = 4294967293(一个“巨大的数字”)。

在执行减法之前转换为带符号的类型。此外,如果您的部署目标是iOS 4.3或更高版本,则更喜欢arc4random_uniform

float x = ((int)arc4random_uniform(10) - 5) * delta;

如果您希望范围包含-5和5,则需要使用11而不是10,因为范围[-5,5](包括)包含11个元素:

float x = ((int)arc4random_uniform(11) - 5) * delta;

答案 1 :(得分:1)

arc4random返回u_int32_t,一种无符号类型。模数也是使用无符号算术执行的,它产生一个0到9之间的数字,如预期的那样(顺便说一下,不要这样做;改为使用arc4random_uniform)。然后你减去5,它被解释为无符号值,由于下溢而产生可能很大的正值。

解决方案是通过将其存储在带符号类型的变量或带后缀(如5L)中来显式键入5。

答案 2 :(得分:0)

看起来arc4random % 10变得小于5,之后您正在使用负整数。

delta的价值是什么?