الفئة Random وبرنامج القرعة
طلب مني أحد الأعزاء في يوم ما طريقة أو فكرة لعرض اسم الفائز في مسابقة خيرية
بطريقة تبهر الحاضرين , فلقد ملوا جميعا من رؤية تلك الفازة التي فيها قصاصات الأسماء والتي يتم سحب اسم الفائز منها بالقرعة
وكشخص تقني يقدر الموقف ذهب بالي فوراً للحل التقني البسيط , وسار خاطري يبحث في ذاكرتي عن حل , وتذكرت فئة ( Class ) الرقم العشوائي Random
في الفيجوال بيسك وافترضت أن لدينا قائمة أسماء يتم تخزين أسماء الأشياء التي نود أن نقوم بالقرعة بينها
, قبل أن نغوص في برنامج صاحبنا دعوني أيها السادة الكرام أستغل هذه المقالة في تعريفكم بالفئة Random , ولكي ننشأ نسخة من نفس الفئة نستعمل الطريقة المعروفة في إنشاء الفئات باستخدام المشيد New لنكتب :
Dim RandomClass As New Random()
مايهمنا حاليا في الفئة RandomClass هو جلب الرقم العشوائي وفي الحالات الطبيعية سنطلب رقماً صحيحاً integer وأقصد ليس رقم كسري به فواصل Double وفي هذه الحالة نستخدم الوسيلة أو الطريقة ( method ) التالي ( Next ) ونكتب
.
Dim RandomNumber As Integer
RandomNumber = Random Class.Next ()
والجواب هو مابين 1 إلى 2,147,483,647 مما يعني انه قد يضهر لك الرقم 15 مرة أو الرقم 124,154,177 في المرة التالية ولا أعتقد أن هنالك شخص يمكن أن يكون رقمه في مسابقة بهذا الرقم إلا أن تكون مسابقة على مستوى الدولة !! لذالك دعنا نفترض مبدئيا ان العدد العشوائي المطلوب لايزيد عن 100 ولنحقق ذلك نعدل تعديل بسيط سطر في الكود السابق كالتالي :
Dim RandomNumber As Integer
RandomNumber = Random Class.Next (100)
هناك عدة حلول منها أن تضع شرط يختبر الرقم إن كان أقل من 45 فيزيد فيه 1 حتى يصل للرقم 45 أو أكبر لكن هذا ياعزيزي المبرمج سيستهلك المزيد من الأسطر ولذلك انصحك بالعودة للكود السابق وكتابته على الطريقة التالية .
Dim RandomNumber As Integer
RandomNumber = Random Class.Next (45,101)
الحل أكتب التالي :
Dim RandomDoubleNumber As Double
RandomDoubleNumber = RandomClass.NextDouble()
والجواب هو أكبر من أو يساوي 0.0 وأصغر من 1.0
حقا ً !!
وماهي الأرقام العجيبة التي تختبئ بين الصفر والواحد ؟؟؟
والجواب هو عدد مهول من الكسور مابين ال 0.0 حتى 0.999,999,999,999,999 لاحظ انه لم يقرب الكسر أقرب جزأ من عشرة أو مئة أوألف بل لأكثربكثير ..
أخيراً أود أن ألمح للطريقة NextBytes والتي تولد مصففو من البايتات فيها 64 عنصر من البايتات كل عنصر أو رقم عشوائي مابين 0 و255
وهذا مثال بسيط عليها
Dim ByteArray(64) As Byte
RandomClass.NextBytes(ByteArray)
For i As Integer = 0 To 64
ListBox1.Items.Add(ByteArray.ToList.Item(i))
Next
لكن دعنا نتسأل ماهو نطاق هذا الرقم العشوائي الذي تولده الطريقة
Next في الكود السابق ؟ لاحظ أنني قلت لايزيد عن 100 ولم أقل أصغر من أو يساوي وهذا يعني ان نطاق الكود السابق هو بين أكبر من أو يساوي صفر وأصغر من أو يساوي ال99 أي أن ال100 ليست ضمن نطاق الكود ولندخل رقم 100 ضمن النطاق نكتب بدلا منها 101 في الكود السابق . لكن مهلاً مهلاً .. ماذا لو كانت الأرقام الخاصة بالمتسابقين لاتنبدأ من ال0 ولا من 1 بل من 45 مثلا ً ؟ فما الحل لاحظ انني كتبت 45 و101 أي رقم أكبر من ويساوي 45 وأصغر من 101 مماي يعني ان 45 داخلة في النطاق وال 101 خارج النطاق .
جميل جدا ً هل انتهينا ؟ مهلا دعنا ننظر أننا لو أردنا رقم عشوائي كسري فيه فواصل أي (Double) فما الحل ؟ وسيتبادر لذهنك تساؤل عن نطاق الرقم الكسري إلى هنا نصل إلى نهاية الإبحار في الفئة Random ومع ما تعلمناه سابقاً من الأمثلة يمكني أن أعود بكم إلى برنامج القرعة الذي قدمته لصديقي , وهو برنامج بيسط جدا ً مكون من فورم واحد يحتوي على صندوق إعدادات بسيط يدخل فيه أسماء الفائزين في القائمة ويقوم البرنامج بخلط أسماء الفائزين لفترة يحددها الشخص
بالثواني وسرعة تقليب الأسماء يحددها حسب ما يود أن يحمس بها الحاضرين
ولتحمل برنامج القرعة يمكنك ذلك عبر الصفحة التالية :