برنامج توليد الأرقام العشوائية في بايثون

كتبت بواسطة Shadi Saleh | بتاريخ الأحد 19 تموز 2020


الأرقام العشوائية لها استخدامات كثيرة وهامة في التعلم الآلي ومعالجة البيانات والألعاب وغيرها، في هذه المقالة سنعرض بشكل سريع مقاطع برمجية هامة حول توليد برامج توليد الأرقام العشوائية برمجياً في بايثون.


الأرقام شبه العشوائية

في الحقيقة لا يوجد شيء عشوائي ١٠٠٪ في الخوارزميات والبرمجيات، والتعبير الرياضي الأدق هو أرقام شبه عشوائية pseudorandom. على أية حال الحصول على  رقم العشوائي بشكل كامل ليس مهما جدا في البرمجيات، ويكفي استخدام أرقام شبه عشوائية.

لمعلومات أكثر حول توليد الأرقام العشوائية حاسوبيا تستطيع قراءة المقالة التالي على مدونة شمرا: توليد الأرقام العشوائية في أنظمة الحاسوب.


الأرقام العشوائية في بايثون

مولد الأرقام العشوائية هو عبارة عن تابع يقوم بتوليد أرقام شبه عشوائية، تابع توليد الأرقام العشوائية قد يحتاج إلى دخل واحد يدعى عادة seed تكون قيمه موجبة صحيحة في حال أردت التحكم بالارقام المولدة (نقطة البداية), ويجب ان يتم استدعاء التابع seed دائما قبل توليد الرقم العشوائي. لتوليد أرقام عشوائية في بايثون نحتاج إلى المكتبة random وإلى تابعين في هذه المكتبة هما seed و random كمايلي:


from random import seed
from random import random
 
def get_randoms():
    return random(), random(), random(), random()
 
seed(1)
print(get_randoms())
seed(1)
print(get_randoms())
seed(2)
print(get_randoms())

 

لاحظ اننا قمنا بكتابة تابع get_randoms يقوم بإعادة أربعة أرقام عشوائية كل مرة نقوم باستدعاء، قم قمنا باستدعاء التابع seed من أجل قيمة ١ ثم قمنا بطباعة الأرقام، ثم كررنا العملية مرة أخرى، ثم قمنا بتغيير قيمة ال seed لتكون نتيجة تنفيذ الكود أعلاه كمايلي:

(0.13436424411240122, 0.8474337369372327, 0.763774618976614, 0.2550690257394217)
(0.13436424411240122, 0.8474337369372327, 0.763774618976614, 0.2550690257394217)
(0.9560342718892494, 0.9478274870593494, 0.05655136772680869, 0.08487199515892163)


النقطة المهمة جدا هنا ان عند ضبط قيمة معينة لل seed فكأننا نقوم بتحديد نقطة البداية للأرقام العشوائية وبالتالي عند تنفيذ التابع عدة مرات سيقوم كل مرة بطابعة نفس الأرقام من أجل نفس قيمة ال seed التي اخترناها، بالتالي هذا يعطينا تحكم بالأرقام العشوائية في حال رغبنا فعلا بتوليد رقم عشوائي ولكن رغبنا أيضا أن يتم توليد نفس الرقم في كل مرة نقوم فيها بتنفيذ البرنامج.

التابع random المستخدم أعلاه يقوم بتوليد أرقام عشرية، في حال أردنا توليد أرقام صحيحة integer يكفي استبدال التابع ب randint وتحديد مجال توليد الأرقام مثلا لاختيار رقم عشوائي بين ٠ وال ١٠٠٠ نقوم بتنفيذ التعليمة التالية:

from random import randint
print(randint(0,1000))

 

ليكون الخرج:

 

960

المهم ذكره هنا  انه في حال لم تكون تريد التحكم بتوليد الأرقام العشوائية, لا تقم باستدعاء التابع seed أبدا بالتالي كل مرة تقوم فيها بتوليد رقم عشوائي عالأغلب ستكون النتائج مختلفة، او بالأحرى سيكون احتمال توليد جميع الأرقام متساويا.


اختيار عنصر عشوائي من List 

قد يكون من المفيد اختيار عنصر عشوائي من لائحة تحوي عدة عناصر في بايثون، ذلك ممكن تحقيقه باستخدام التابع randint لتوليد رقم عشوائي بين ٠ و طول اللائحة ناقص واحد، اي أذا كانت اللائحة تحوي ١٠ عناصر نقوم بتوليد أرقام عشوائية بين [0,9]  كمايلي:

from random import randint
 
list_names = ['red','green','blue','white']
 
print(list_names[randint(0,len(list_names)-1)])


أيضا يوجد تابع مفيد جدا في مكتبة random يدعى choice مخصص لهذا الاستخدام، بدل من توليد رقم عشوائي يمثل فهرس المصفوفة, يقوم التابع باختيار العنصر بشكل مباشر كمايلي:

from random import choice
 
list_names = ['red','green','blue','white']
 
print(choice(list_names))


إعادة توزيع سلسلة عشوائياً

أيضا من أحد التوابع المفيدة هو اعادة توزيع سلسلة عشوائياً اي shuffling لعناصر السلسلة واستخدامها بترتيب مختلف كمايلي:

from random import shuffle
list_names = ['red','green','blue','white']
 
print(list_names)
shuffle(list_names)
print(list_names)

عند تنفيذ البرنامج أعلاه حصلت على:

['red', 'green', 'blue', 'white']
['green', 'white', 'red', 'blue']

 

أتمنى ان تكون قد عرضت بعض المعلومات السريعة المفيدة في هذه المقالة، في حال كان لديك أي سؤال لا تردد بالتعليق على المقالة في الأسفل.