البذرة arc4random () في iOS
-
27-09-2019 - |
سؤال
من ما يمكنني جمعه arc4random()
يولد أرقام عشوائية أفضل بكثير من rand()
ومع ذلك ، لم أر طريقة لبذورها ، و وأود أن تماما مثل استخدام srand()
. هل هناك طريقة؟
المحلول
هذا ليس ما تم تصميم ARC4Random للقيام به. كما تنص الوثائق:
ال
arc4random()
توفر الوظيفة رقمًا عالي الجودة عالي الجودة 32 بت بسرعة كبيرة.arc4random()
البذور نفسها بشكل منتظم من النظام الفرعي العشوائي القوي kernel الموصوف فيrandom(4)
.
نظرًا لأنه يتم إعادة تمييزه من مصدر إنتروبيا على أي حال ، فإنك لا تكسب شيئًا عن طريق تبديله يدويًا ، وفي الواقع ، لم تكن هذه الطريقة موجودة.
نصائح أخرى
يمكنك فعل ذلك بالفعل في iOS 9.
import GameKit
let source = GKARC4RandomSource(seed: "hello world".data(using: .utf8)!)
source.dropValues(1024)
source.nextInt() // <-- your number
وفقا للمستندات:
المصادر العشوائية المستندة إلى ARC4 لها تسلسل أولي قابل للتكرار. إذا تم استخدامه للتشويش ، فيجب عليك إسقاط قيم N من البداية ، حيث يجب أن يكون N أي رقم أكبر من 768 لضمان مسح التسلسل الأولي.
طالما أنك تستخدم نفس بيانات البذور (من الواضح دون استخدام !
في رمز الإنتاج) ونفس العدد من القيم التي تم إسقاطها ، ستحصل على نفس النتائج.
في سويفت 3 أنا أستخدم srand48()
و drand48()
عندما أحتاج إلى قيمة مصنفة. لقد وضعت هذه الوظيفة التي يبدو أنها تعمل بشكل جيد بما يكفي لاحتياجاتي:
func seeded_rand(seed:Int, min:Double, max:Double) -> Int
{
srand48(seed)
return Int(round(drand48() * (max-min)) + min)
}
يمكنك إضافة تسلسل بايت كعشوائية إلى ARC4Random باستخدام: arc4random_addrandom()
لا تحتاج فعليًا إلى البذور ... إنها بذور نفسها في المكالمة الأولى. تحقق من الوثائق عن طريق الاتصال
man arc4random
في قشرتك. الخط ذو الصلة ، تحت الوصف ، هو:
There is no need to call arc4random_stir() before using arc4random(),
since arc4random() automatically initializes itself.