私はそれに0と400を与え、時々400以上の値を返します。それは理にかなっていません。このランダム化機能の何が問題になっていますか?
- (float)randomValueBetween:(float)low andValue:(float)high {
return (((float) arc4random()/RAND_MAX) * (high - low)) + low;
}
実際にはネット上で見つかったスニペットです。誰かがそこのバグを見るかもしれない?
私はそれに0と400を与え、時々400以上の値を返します。それは理にかなっていません。このランダム化機能の何が問題になっていますか?
- (float)randomValueBetween:(float)low andValue:(float)high {
return (((float) arc4random()/RAND_MAX) * (high - low)) + low;
}
実際にはネット上で見つかったスニペットです。誰かがそこのバグを見るかもしれない?
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;
}
私は明示的ではなく 'UINT32_MAX'を使用したいと思います値。 –
彼は本当に '0xffffffff'のように怒っているようですね! – bobobobo
arc4random
は、ゼロから(2^32 - 1)に擬似乱数値を返すRAND_MAX
は、(2^31のデフォルト値を有します - 1)ので機能は、おそらく中にランダムな値のため、2
倍までで(high - low)
範囲を乗算されます範囲は0 - 800
です。 iPhone上
は、RAND_MAXは0x7FFFFFFFで(2147483647)、arc4random()は(4294967296)を0x100000000の最大値を返し、そうする一方/(2147483647)= 2である..... 2 *(400-0) + 0 = 800!方法は
返すことができる最大値は、単純なバリアントは次のようになります。
- (float)randomValueBetween:(float)low andValue:(float)high {
return (arc4random() % * (high - low)) + low;
}
すでにMOD操作はなぜ関心の範囲に直接それをしないでやっているので?
また、丸数字だけを渡す場合は、なぜ浮動小数点数(および浮動小数点数)を渡すのですか?整数がより効率的です。
'high'と 'low 'の違いが浮動小数点の場合、[' fmodf() '](http://developer.apple.com/library/ios/#documentation/System/Conceptual /ManPages_iPhoneOS/man3/fmodf.3.html) – bobobobo
このバグは、UIKit、iPhone、(ややObjective-C;)とはあまり関係ありません) – jbrennan
よくわかります;) – Thanks