为什么使用Float(arc4random())/ 0xFFFFFFFF而不是drand()

时间:2015-12-28 09:13:29

标签: swift random cgfloat

我是Swift的新手,只是看到这段代码用于在教程中生成随机角度。

func random() ->CGFloat{
    return CGFloat(Float(arc4random()) / 0xFFFFFFFF)
}
func random(#min: CGFloat, max:CGFloat) ->CGFloat{
    return random()*(max-min)+min
}

我想知道行return CGFloat(Float(arc4random()) / 0xFFFFFFFF)生成0到1.0之间的随机浮点数?那么为什么不能只使用drand()?这两个功能有什么区别?谢谢!

1 个答案:

答案 0 :(得分:4)

drand48()适用于许多应用程序,但不安全(换句话说是可预测的)。 arc4random()虽然not perfect的设计考虑了安全性。

我认为Apple因此推动人们arc4random()。所以,回答你的问题:如果你要生成随机数来模拟某些东西,drand48应该没问题,但是如果你要生成随机数来保护某些东西,那么使用arc4random()(或更安全的东西)比如SecRandomCopyBytes())。

来自ONLamp的Secure Programming Techniques

  

drand48(),lrand48()和mrand48()

     

drand48()函数是构成System V随机数生成器的众多函数之一。根据Solaris文档,该算法使用"众所周知的线性同余算法和48位整数算法。"函数drand48()返回一个大于或等于0.0且小于1.0的双精度数,而lrand48()和mrand48()函数返回指定整数范围内的随机数。与random()一样,这些函数为模拟和游戏提供了出色的随机数,但不应用于安全相关的应用程序,如选择加密密钥或模拟一次性密码;线性同余算法太容易破解。