乱数を使って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]の範囲の乱数を生成するはずです。ただし、a)のみが機能します。b)[-1、1]の範囲の数値のみを生成します。
各呼び出しの2番目のランダムな部分が最初に解決され、キャッシュされてから、上限に関係なく、行の最初の部分で再利用されるようです。
誰かがb)が機能しない理由を説明して明確にすることができますか?