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范围内的数字(乘以一些小数字).为什么我得到这样的数字?
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)
| 归档时间: |
|
| 查看次数: |
221 次 |
| 最近记录: |