Зачем использовать Float(arc4random()) / 0xFFFFFFFF вместо drand()
Я новичок в 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 ответ
drand48()
подходит для многих приложений, но небезопасен (другими словами, предсказуем). arc4random()
в то время как не идеальный был разработан с учетом безопасности.
Я думаю, что Apple подталкивает людей к arc4random()
из-за этого. Итак, чтобы ответить на ваш вопрос: если вы генерируете случайные числа для симуляции чего-либо, drand48
должно быть хорошо, но если вы генерируете случайные числа для защиты чего-либо, используйте arc4random()
(или что-то еще более безопасное, как SecRandomCopyBytes()
).
Из методов безопасного программирования ONLamp:
drand48(), lrand48() и mrand48()
Функция drand48() является одной из многих функций, которые составляют генератор случайных чисел System V. Согласно документации Solaris, алгоритм использует "хорошо известный линейный конгруэнтный алгоритм и целочисленную арифметику с 48 битами". Функция drand48() возвращает число двойной точности, которое больше или равно 0,0 и меньше 1,0, в то время как функции lrand48() и mrand48() возвращают случайные числа в указанном целочисленном диапазоне. Как и в случае random(), эти функции предоставляют отличные случайные числа для симуляций и игр, но их не следует использовать для приложений, связанных с безопасностью, таких как выбор криптографических ключей или имитация одноразовых планшетов; линейные конгруэнтные алгоритмы слишком легко сломать.