Я столкнулся с довольно неожиданной проблемой, когда делал некоторые вещи для iOS со случайными числами.
Сравните это:
a)
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]. Однако работает только а). б) производит только числа в диапазоне [-1, 1].
Кажется, что вторая случайная часть каждого вызова сначала разрешается, кэшируется, а затем повторно используется для первой части строки, независимо от верхней границы.
Может кто-нибудь объяснить и уточнить, почему б) не работает?