سؤال

من ما يمكنني جمعه 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()

http://developer.apple.com/library/mac/#documentation/darwin/reference/manpages/man3/arc4random.3.html

لا تحتاج فعليًا إلى البذور ... إنها بذور نفسها في المكالمة الأولى. تحقق من الوثائق عن طريق الاتصال

man arc4random

في قشرتك. الخط ذو الصلة ، تحت الوصف ، هو:

There is no need to call arc4random_stir() before using arc4random(),
since arc4random() automatically initializes itself.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top