我正在使用Xcode 6中的游戏,每次2个特定对象相互接触时需要生成一个新的随机数。我已经尝试在我的应用程序开始时使用srand(),但似乎值保持不变,就好像每次对象碰撞时都没有播种新值。
这是代码
if((CGRectIntersectsRect(Stickman.frame, Box1.frame))) {
xRan = arc4random()%11;
if(xRan<=3){
Spike1 = true;
[self SpikeCall];
}
//Gold
if (xRan==10) {
G1 = true;
}
Box1.center = CGPointMake(0,278);
Box1SideMovement = 5;
}
问题是,当Stickman击中Box1后,当它返回到屏幕上时,它仍然在xRan中保持相同的值,除了在1-3之间的某些情况下它会使Spike1成为真。我希望每次Box1与Stickman相交时,xRan会在1-10之间播种一个新的数字,这样G1就有十分之一的机会成为真正的&amp;如果xRan是1-3,它将使Spike1成为真。
答案 0 :(得分:1)
这不仅仅是一个评论而是一个答案,但评论的时间太长了。
您的方法存在一些问题。首先,srand
不会为arc4random
函数设定种子。它为rand
函数提供种子,这是一个不同的伪随机数生成器,其属性比arc4random
稍差。 arc4random
没有明确的种子功能。其次,如果您想要1到10之间的随机数,则不应使用% 11
方法。这给你一个0到10之间的随机数(我认为你不想要零),但它也可能不会给你一个统一的分布。即使arc4random
擅长在整个范围内提供均匀分布,也可能无法提供最低有效位的均匀分布。
我建议你使用类似的东西:
arc4random_uniform(10) + 1
arc4random_uniform(10)
将返回0到9之间的数字,并且可以很好地在该范围内提供均匀分布。 +1
只是改变你的间隔,所以你得到1到10而不是0到9之间的数字。