ما معنى RNG (مولّد الأرقام العشوائية) في الخوارزميات وهياكل البيانات؟

شروحات تقنية

اختصار RNG يعني Random Number Generator، أي «مولّد الأرقام العشوائية»: مكوّن برمجي أو عتادي مهمّته إنتاج سلسلة من الأرقام يصعب التنبّؤ بالرقم التالي فيها. في سياق الخوارزميات وهياكل البيانات، الـ RNG ليس مجرد «رقم عشوائي» تحصل عليه من دالة جاهزة، بل أداة تُستخدم لاتخاذ قرارات داخل الخوارزمية نفسها: أيّ عنصر نختار كمحور؟ أيّ مستوى نمنحه لعقدة جديدة؟ أيّ عيّنة نأخذ من بيانات ضخمة؟

إن وصلت إلى هنا من كلمة «RNG» في لعبة أو تطبيق، فالمعنى نفسه: النظام يعتمد على مولّد أرقام عشوائية ليقرّر النتائج (سقوط جائزة نادرة مثلاً)، ولهذا يقول اللاعبون «حظ الـ RNG». الفكرة التقنية واحدة في الحالتين، والفرق فقط في مكان استخدامها.

أنواع مولّدات الأرقام العشوائية

تنقسم هذه المولّدات إلى نوعين جوهريين يخلط كثيرون بينهما:

  • مولّد عشوائي حقيقي (TRNG): يستمدّ العشوائية من ظاهرة فيزيائية فعلية لا يمكن التنبّؤ بها، مثل الضوضاء الحرارية في الدوائر الإلكترونية أو توقيت أحداث دقيقة. مخرجاته «عشوائية حقيقية» لكنه أبطأ ويحتاج عتاداً خاصاً، لذلك يُستخدم غالباً في توليد مفاتيح التشفير الحسّاسة.
  • مولّد شبه عشوائي (PRNG): خوارزمية رياضية بحتة تنتج أرقاماً تبدو عشوائية لكنها في الحقيقة محدّدة بالكامل. هو الأكثر استخداماً في البرمجة لأنه سريع جداً وقابل للتكرار، ويكفي لمعظم التطبيقات غير الأمنية.

الخلط الشائع أن الناس يظنون أن دالة مثل Math.random() أو rand() «عشوائية تماماً»؛ الصحيح أنها PRNG: لو عرفت حالتها الداخلية، أمكنك توقّع كل رقم قادم. ولهذا السبب لا يجوز استخدامها لتوليد كلمات مرور أو مفاتيح تشفير.

مفهوم «البذرة» (Seed) ولماذا يهمّك

المولّد شبه العشوائي يبدأ من قيمة ابتدائية تُسمّى البذرة (seed). من البذرة نفسها تخرج دائماً السلسلة نفسها من الأرقام. هذه ليست عيباً بل ميزة عملية للغاية:

  • تكرار التجارب: في علوم البيانات والتعلّم الآلي، تثبيت البذرة (مثل seed=42) يجعل نتائج التجربة قابلة لإعادة الإنتاج بحرفيتها، فيستطيع زميلك الحصول على النتيجة نفسها.
  • تصحيح الأخطاء: لو انهار برنامج عند تسلسل عشوائي معيّن، تثبيت البذرة يعيد إنتاج المشكلة نفسها بدل مطاردة خطأ «يظهر ويختفي».
  • الاختبار: يمكنك كتابة اختبارات تتوقّع مخرجات محدّدة سلفاً لأن التسلسل صار ثابتاً.

في المقابل، إذا أردت سلوكاً مختلفاً في كل تشغيل (كلعبة ورق مثلاً)، فأنت تغذّي المولّد ببذرة متغيّرة مثل الوقت الحالي.

أين يظهر الـ RNG داخل الخوارزميات وهياكل البيانات؟

هنا يظهر الدور الحقيقي الذي لا تراه في مجرد «رقم عشوائي على الشاشة»:

  1. الترتيب السريع العشوائي (Randomized QuickSort): اختيار المحور عشوائياً بدل اختياره ثابتاً يمنع الخوارزمية من الوقوع في أسوأ حالاتها على البيانات المرتّبة مسبقاً، فيبقى الأداء المتوسط ممتازاً.
  2. قائمة التخطّي (Skip List): بنية بيانات تُنافس الأشجار المتوازنة، وتقرّر ارتفاع كل عقدة عشوائياً عبر الـ RNG بدل موازنة معقّدة، فتحصل على أداء بحث ممتاز في المتوسط بكود أبسط.
  3. جداول التجزئة (Hashing): تقنية «التجزئة العامة» تختار دالة التجزئة عشوائياً لتقليل التصادمات ومنع مهاجم من إبطاء النظام عمداً.
  4. الخوارزميات الاحتمالية: مثل اختبار «ميلر–رابين» لفحص الأعداد الأولية، وأخذ العيّنات العشوائية من مجموعات بيانات ضخمة يصعب معالجتها كاملة.
  5. التشفير: توليد المفاتيح وأرقام الاستخدام الواحد (nonces) يعتمد على مولّد آمن تشفيرياً يُسمّى CSPRNG، وليس على rand() العادي إطلاقاً.

نصيحة عملية: اختر المولّد المناسب لغرضك

الخطأ الأكثر شيوعاً بين المبتدئين هو استخدام مولّد واحد لكل شيء. القاعدة العملية:

  • لألعاب، محاكاة، أو خلط عناصر: PRNG عادي يكفي وهو الأسرع.
  • لتجارب علمية تحتاج تكراراً: PRNG مع بذرة ثابتة.
  • لأي شيء أمني (كلمات مرور، مفاتيح، رموز جلسات): استخدم مولّداً آمناً تشفيرياً فقط، مثل secrets في بايثون أو crypto.getRandomValues في المتصفح، ولا تلجأ أبداً إلى Math.random().

الأسئلة الشائعة

هل الـ RNG عشوائي فعلاً بنسبة مئة بالمئة؟ معظم ما تستخدمه في البرمجة هو PRNG، أي «شبه عشوائي» ومحدّد رياضياً. العشوائية الحقيقية تأتي فقط من مصدر فيزيائي (TRNG) أو من مولّد آمن يجمع «إنتروبيا» من نظام التشغيل.

ما الفرق بين RNG وseed؟ الـ RNG هو الآلة المولّدة، والـ seed هي القيمة الابتدائية التي تبدأ منها هذه الآلة. البذرة نفسها تعطي دائماً السلسلة نفسها.

لماذا لا أستخدم Math.random() لكلمات المرور؟ لأنها PRNG قابل للتنبّؤ؛ يمكن لمهاجم متمكّن استنتاج مخرجاتها. استخدم دائماً مولّداً آمناً تشفيرياً (CSPRNG) في أي سياق أمني.

هل RNG في الألعاب هو نفسه في الخوارزميات؟ نعم من حيث المبدأ؛ كلاهما مولّد أرقام عشوائية. الفرق أن اللعبة تحوّل الرقم إلى نتيجة مرئية (جائزة أو ضربة موفّقة)، بينما تستخدمه الخوارزمية داخلياً لاتخاذ قرار في التنفيذ.