سؤال

هل يمكنني ضبط مجموعة من الأرقام عند استخدام ARC4Random ()؟ على سبيل المثال 50-100 فقط.

هل كانت مفيدة؟

المحلول

كما هو موضح في المنشورات الأخرى أدناه ، من الأفضل الاستخدام arc4random_uniform. (عندما كتبت هذه الإجابة في الأصل ، arc4random_uniform لم يكن متاحا). إلى جانب تجنب تحيز Modulo من arc4random() % x, ، كما أنه يتجنب مشكلة البذر مع arc4random عند استخدامها بشكل متكرر في الأطر الزمنية القصيرة.

arc4random_uniform(4)

سوف تولد 0 أو 1 أو 2 أو 3. وبالتالي يمكنك استخدام:

arc4random_uniform(51)

وأضف فقط 50 إلى النتيجة للحصول على مجموعة تتراوح بين 50 و 100 (شاملة).

نصائح أخرى

للتوسع على تعليق جونك.

يُقترح أن تستخدم الوظيفة التالية لإرجاع رقم عشوائي تراوحت:

arc4random_uniform(51)

الذي سيعيد رقمًا عشوائيًا في النطاق 0 ل 50.

ثم يمكنك إضافة حدودك السفلية إلى هذا مثل:

arc4random_uniform(51) + 50

الذي سيعيد رقمًا عشوائيًا في النطاق 50 ل 100.

سبب استخدامنا arc4random_uniform(51) على arc4random() % 51 هو تجنب التحيز Modulo. تم تمييز هذا في صفحة الرجل على النحو التالي:

سيعود ARC4Random_uniform (UPPER_BOUND) رقمًا عشوائيًا موزعة موزعة أقل من UPPER_BOUND. ينصح ARC4Random_Uniform () على إنشاءات مثل `` arc4random () ٪ upper_bound "لأنها تتجنب" تحيز modulo "عندما لا يكون الحد الأعلى قوة اثنين.

باختصار ، تحصل على رقم عشوائي موزعة أكثر توزيعًا تم إنشاؤه.

int fromNumber = 10;
int toNumber = 30;
int randomNumber = (arc4random()%(toNumber-fromNumber))+fromNumber;

سوف يولد randon number بين 10 و 30, ، بمعنى آخر 11,12,13,14......29

يمكنك استخدام هذا الرمز لإنشاء قيم عشوائية مع النطاق:

//range from 50 to 100
int num1 = (arc4random() % 50) + 50; or
int num1 = arc4random_uniform(50) + 50;

//range from 0-100
int num1 = arc4random() % 100; or
int num1 = arc4random_uniform(100);

في Swift يمكنك استخدام هذا (مستوحى من الإجابة Justyn)

func generateRandomKey(fromRange rangeFrom:Int, toRange rangeTo:Int) -> Int{

    let theKey = arc4random_uniform(UInt32(rangeTo - rangeFrom)) +  UInt32(rangeFrom)
    return Int(theKey)
}

سوف يعطيك دائمًا عدد صحيح من النطاق العشوائي.

في العديد من المواقف 10 من خلال 30 من شأنها أن تعني شاملة ، (يشمل 10 و 30) ...

int fromNumber = 10;
int toNumber = 30;
toNumber ++;
int randomNumber = (arc4random()%(toNumber-fromNumber))+fromNumber;

لاحظ الاختلاف TONUMBER - FromNumber هو الآن 21 ... (20+1) الذي ينتج عن النتائج المحتملة لـ 0 Thru 20 (شاملة) والتي عند إضافتها إلى العاب (10) تؤدي إلى 10 من خلال 30 (شاملة).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top