在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范围内的数字(乘以一些小数字)。为什么我得到这样的数字?
答案 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
的价值是什么?