كيفية تحديد نطاق القيم عند استخدام ARC4Random ()
-
26-09-2019 - |
سؤال
هل يمكنني ضبط مجموعة من الأرقام عند استخدام 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 (شاملة).