arc4random抛出巨大的数字

blu*_*unt 2 iphone objective-c cocos2d-iphone arc4random

在cocos2d游戏中,我使用arc4random来生成这样的随机数:

    float x = (arc4random()%10 - 5)*delta;
Run Code Online (Sandbox Code Playgroud)

(delta是计划更新方法中更新之间的时间)

    NSLog(@"x: %f", x);
Run Code Online (Sandbox Code Playgroud)

我一直在检查它们.

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

    2012-12-29 15:37:18.206 Jumpy[1924:907] x: 0.033444
Run Code Online (Sandbox Code Playgroud)

要么

    2012-12-29 15:37:18.247 Jumpy[1924:907] x: 0.033369
Run Code Online (Sandbox Code Playgroud)

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

    2012-12-29 15:37:18.244 Jumpy[1924:907] x: 71658664.000000
Run Code Online (Sandbox Code Playgroud)

编辑:Delta几乎总是:

    2012-12-29 17:01:26.612 Jumpy[2059:907] delta: 0.016590
Run Code Online (Sandbox Code Playgroud)

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

rob*_*off 6

arc4random返回一个u_int32_t.u_部分告诉你它没有签名.因此括号内的所有运算符都使用无符号算术.

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

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

float x = ((int)arc4random_uniform(10) - 5) * delta;
Run Code Online (Sandbox Code Playgroud)

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

float x = ((int)arc4random_uniform(11) - 5) * delta;
Run Code Online (Sandbox Code Playgroud)