شرح random في Python يحتاج تمييز هدف الاستخدام. اختيار قيمة لتجربة لعبة أو محاكاة يختلف عن إنشاء كلمة مرور أو رمز استعادة. يوفر random مولدًا مناسبًا للتجارب ويمكن جعل نتائجه قابلة للتكرار، لكنه ليس الاختيار المناسب للأسرار. لذلك يستخدم المثال random لرميات النرد وsecrets لاختيار أحرف كلمة مرور، ولا يقدم كلمة مرور ثابتة ينسخها جميع القراء.
التجهيز والمتطلبات
# random, secrets and string are part of Python.الأعداد والاختيار والعينات
يعيد randint(1, 6) عددًا صحيحًا يشمل الطرفين، وهو مناسب لنرد ذي ستة أوجه. أما randrange فيشبه حدود range حيث النهاية غير مشمولة. يمكن choice اختيار عنصر واحد من تسلسل غير فارغ، وsample اختيار عناصر دون تكرار المواضع، بينما choices يسمح بتكرارها. فهم الفرق يمنع الاعتماد على نتائج تبدو عشوائية لكنها لا تطابق شروط المسألة. افحص طول المدخل قبل اختيار عينة أكبر منه.
seed دون تغيير مولد البرنامج كله
تنشئ الدالة random.Random(seed) مولدًا محليًا بدل تعديل حالة random العامة. عند استخدام البذرة نفسها في البيئة نفسها تحصل على تجربة قابلة للمراجعة، وهذا مفيد لتتبع خطأ في محاكاة. لا تستخدم بذرة وقت أو رقم ثابت لتحويل random إلى مولد أسرار؛ إمكانية إعادة التسلسل هي عكس ما نريد لكلمة مرور. تغيير عدد السحوبات قبل خطوة ما يغير ما بعدها، لذلك احتفظ بخطوات الاختبار واضحة.
المثال البرمجي الكامل
import random
import secrets
import string
def simulated_rolls(count, seed=None):
if count < 0:
raise ValueError("Count cannot be negative")
generator = random.Random(seed)
return [generator.randint(1, 6) for _ in range(count)]
def make_password(length=20):
if length < 12:
raise ValueError("Use at least 12 characters for this example")
alphabet = string.ascii_letters + string.digits + "-_.!"
return "".join(secrets.choice(alphabet) for _ in range(length))
if __name__ == "__main__":
print("Repeatable simulation:", simulated_rolls(5, seed=42))
print("Random password:", make_password())
كلمة مرور عشوائية باستخدام secrets
تختار make_password كل حرف عبر secrets.choice من مجموعة محددة، وترفض طولًا أقل من 12 في هذا المثال. طول 20 افتراضي للتجربة وليس ضمانًا مناسبًا لكل سياسة. قد تتطلب خدمة شروطًا إضافية لتوزيع أنواع الأحرف؛ مجرد وجودها في alphabet لا يضمن ظهور كل نوع في كل نتيجة. لرموز الجلسات يمكن استخدام secrets.token_urlsafe بدل تركيب كلمات مرور يدويًا. لا تسجل الأسرار الناتجة في تطبيق إنتاجي أو تشاركها في لقطات شاشة.
تشغيل المثال والتحقق من السلوك
احفظه باسم random_demo.py دون تسمية الملف random.py كي لا يحجب المكتبة. يعرض سطر النرد نتائج متكررة عند seed=42، بينما تتغير كلمة المرور عادة بين التشغيلات. لا تختبر العشوائية بافتراض أن كل نتيجتين يجب أن تختلفا؛ تساوي نتيجة قصيرة ممكن. تحقق من المجال والطول وشروط الإدخال، وافصل اختبار المحاكاة عن إنشاء أسرار حقيقية. لا تستخدم القائمة باسم list كمتغير حتى لا تحجب النوع المدمج أثناء التجارب.
هل sample يمنع تكرار القيمة؟
يختار sample مواضع دون تكرار من التسلسل، لكن إذا كانت القائمة الأصلية تحتوي القيمة نفسها في أكثر من موضع فقد تظهر القيمة متكررة في العينة. لذلك حدد هل المطلوب مواضع مختلفة أم قيم فريدة، وعالج المدخل وفق ذلك. أما shuffle فيغير القائمة في مكانها ولا يعيد قائمة جديدة للاستخدام المباشر. هذه فروق بسيطة لكنها تسبب نتائج تبدو خاطئة عندما يختار المبرمج الدالة من اسمها فقط دون قراءة سلوكها.
كيف أختبر البرنامج دون تثبيت كلمة المرور؟
يمكن التحقق من طول الناتج وأن كل حرف ينتمي إلى المجموعة المسموحة، ومن رفض الأطوال غير المقبولة. لا تجعل الاختبار يقارن كلمة مرور مولدة بنص ثابت، ولا تبدل secrets بمولد ثابت في كود الإنتاج لتسهيل الاختبار. إذا احتجت عزل الاختبار فمرر مصدر اختيار تجريبي عبر دالة مستقلة مع إبقاء المسار الحقيقي واضحًا. تجنب أيضًا طباعة كلمات مرور حقيقية في سجلات التشغيل؛ الطباعة هنا لعرض ناتج تعليمي محلي فقط.
هل زيادة التنوع وحدها تكفي؟
قوة كلمة المرور تتعلق بطريقة الاختيار والطول وسياسة الاستخدام، ولا تتحقق بمجرد وجود رمز خاص واحد. قد تفرض خدمة قيودًا تجعل بعض الأحرف غير مقبولة، فيجب مواءمة المولد دون خفض الطول عشوائيًا. استخدم مدير كلمات مرور موثوقًا للحسابات الفعلية، ولا تعيد استخدام ناتج مثال منشور. ولرموز التحقق قصيرة العمر أضف على مستوى التطبيق مدة صلاحية وحد محاولات وتخزينًا مناسبًا؛ اختيار الرقم وحده ليس النظام كله.
المراجع
الصور والفيديو من الشرح السابق
الكود النصي أعلاه هو النسخة المصححة؛ قد تختلف المواد المرئية السابقة في أسماء المتغيرات أو طريقة التشغيل.







