需要对随机函数迅速进行解释

Mad*_*fie 3 random swift

有一个关于我的随机函数的问题:为什么会出现此错误?

'4294967295' is not exactly representable as 'Float'; it becomes '4294967296'
Run Code Online (Sandbox Code Playgroud)

--

我的代码是

func random() ->CGFloat {
    return CGFloat(Float(arc4random()) / 0xFFFFFFFF)
}
func  random(min: CGFloat, max: CGFloat) -> CGFloat {
    return random() * (max - min) + min
}
Run Code Online (Sandbox Code Playgroud)

它不会改变应用程序的功能,但是却无处不在。

提前致谢!

Mar*_*n R 7

IEEE 754的32位浮点数具有用于尾数,这是不够的存储一个10位的整数恰好24显著位:

print(0xFFFFFFFF)             // 4294967295
print(Float(0xFFFFFFFF))      // 4.2949673e+09
print(Int(Float(0xFFFFFFFF))) // 4294967296
Run Code Online (Sandbox Code Playgroud)

那不会影响您的代码,因为

Float(arc4random()) / Float(0xFFFFFFFF)
Run Code Online (Sandbox Code Playgroud)

仍然是0.0到1.0之间的浮点数。将计算更改为

return CGFloat(arc4random()) / 0xFFFFFFFF
Run Code Online (Sandbox Code Playgroud)

将在64位平台上修复该警告:整数常量现在转换为(64位)Double

但是从Swift 4.2开始,您可以使用新的RandomAPI完全避免该问题:

func random(min: CGFloat, max: CGFloat) -> CGFloat {
    return CGFloat.random(in: min...max)
}
Run Code Online (Sandbox Code Playgroud)