2

在 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

编辑:三角洲几乎总是:

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

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

4

3 回答 3

6

arc4random返回一个u_int32_tu_部分告诉您它是未签名的。所以括号内的所有运算符都使用无符号算术。

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

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

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

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

float x = ((int)arc4random_uniform(11) - 5) * delta;
于 2012-12-29T22:18:35.373 回答
1

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

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

于 2012-12-29T22:19:43.870 回答
0

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

的价值是delta多少?

于 2012-12-29T20:54:40.000 回答