在用随机数做一些 iOS 东西时,我偶然发现了一个非常令人惊讶的问题。
比较这些:
一个)
int xOffsetSign = randomIntWithUpperLimit(2) ? 1:-1;
int yOffsetSign = randomIntWithUpperLimit(2) ? 1:-1;
int xOffset = randomIntWithUpperLimit(50) * xOffsetSign;
int yOffset = randomIntWithUpperLimit(50) * yOffsetSign;
b)
int xOffset = randomIntWithUpperLimit(50) * randomIntWithUpperLimit(2) ? 1:-1;
int yOffset = randomIntWithUpperLimit(50) * randomIntWithUpperLimit(2) ? 1:-1;
这是随机函数:
static inline int randomIntWithUpperLimit(unsigned int upperLimit) {
return arc4random_uniform(upperLimit);
}
在我看来,a) 和 b) 都应该产生 [-49,49] 范围内的随机数。但是,只有 a) 有效。b) 只产生 [-1, 1] 范围内的数字。
似乎每个调用的第二个随机部分首先得到解决,被缓存,然后再用于该行的第一部分,无论上限如何。
有人可以解释并澄清为什么 b) 不起作用吗?