2009-07-15 15 views
5

私はそれに0と400を与え、時々400以上の値を返します。それは理にかなっていません。このランダム化機能の何が問題になっていますか?

- (float)randomValueBetween:(float)low andValue:(float)high { 
    return (((float) arc4random()/RAND_MAX) * (high - low)) + low; 
} 

実際にはネット上で見つかったスニペットです。誰かがそこのバグを見るかもしれない?

+0

このバグは、UIKit、iPhone、(ややObjective-C;)とはあまり関係ありません) – jbrennan

+0

よくわかります;) – Thanks

答えて

7

manual page for arc4randomは、戻り値がu int32(つまり0 to (2**32)-1)の有効な範囲内にあることを示します。これは、RAND_MAXの代わりに0xFFFFFFFFで除算したいと思うことを意味します(これはライブラリに依存しているため、正確に何かを確認する必要があります)。

あなたの機能は、このようになるはずである:

- (float)randomValueBetween:(float)low andValue:(float)high { 
    return (((float) arc4random()/0xFFFFFFFFu) * (high - low)) + low; 
} 
+1

私は明示的ではなく 'UINT32_MAX'を使用したいと思います値。 –

+0

彼は本当に '0xffffffff'のように怒っているようですね! – bobobobo

6
  • arc4randomは、ゼロから(2^32 - 1)に擬似乱数値を返す
  • RAND_MAXは、(2^31のデフォルト値を有します - 1)

ので機能は、おそらく中にランダムな値のため、2倍までで(high - low)範囲を乗算されます範囲は0 - 800です。 iPhone上

3

は、RAND_MAXは0x7FFFFFFFで(2147483647)、arc4random()は(4294967296)を0x100000000の最大値を返し、そうする一方/(2147483647)= 2である..... 2 *(400-0) + 0 = 800!方法は

0

返すことができる最大値は、単純なバリアントは次のようになります。

- (float)randomValueBetween:(float)low andValue:(float)high { 
    return (arc4random() % * (high - low)) + low; 
} 

すでにMOD操作はなぜ関心の範囲に直接それをしないでやっているので?

また、丸数字だけを渡す場合は、なぜ浮動小数点数(および浮動小数点数)を渡すのですか?整数がより効率的です。

+0

'high'と 'low 'の違いが浮動小数点の場合、[' fmodf() '](http://developer.apple.com/library/ios/#documentation/System/Conceptual /ManPages_iPhoneOS/man3/fmodf.3.html) – bobobobo

関連する問題