2012-01-02 27 views
3

私はこのコードを使用していますが、 'length'の値は '50'です。厄介なarc4randomの結果

2012-01-02 21:10:50.794 Kipos[28833:207] Creature Move X:4294967296.000000, Y:4294967296.000000 
2012-01-02 21:10:50.896 Kipos[28833:207] Creature Move X:4294967296.000000, Y:12.000000 

は何が起こっている:

newX = (arc4random()%(lenght+1)) - (lenght/2); 
newY = (arc4random()%(lenght+1)) - (lenght/2); 
NSLog(@"Creature Move X:%f, Y:%f", newX, newY); 

しかし、私はのようなものを取得し、デバッガで

newXnewYフロートである:

float newX; 
float newY; 
+0

非常に奇妙な...「lenght」(typo btw)のタイプは何ですか?また、このログと同時にNSLogできますか? – joerick

+0

長さ(typo * facepalm *)はintです。すでに解決済み。しかし、ありがとう! –

答えて

5

arc4random符号なし INT(おそらくlengthも符号なし)を返します。コードをたとえばに変更します。

newX = (float)((int)(arc4random() % (length + 1))) - (length/2)); 

減算するとオーバーフローを避けるためです。

私はまた、結果に明示的な浮動小数点型を追加しましたが、これは厳密には必要ではありませんが、コードを少しだけ自明にしています。

+0

あなたはそれを見つけるためにどこを探しましたか?私の怠惰なグーグルは返り値の型を見つけることができませんでした。 –

+0

だから私はここでは '長さ'も署名されていないと思いますか?さもなければ、コンパイラは、減算を行う前に、左のオペランドを符号付きのintに変換する必要がありますか?それとも私はこれが間違っているのですか? – joerick

+0

@joerick:はい、私はあなたがおそらく正しいと思います –