
في اللغة اليومية، «عشوائي» يعني غير متوقع. أما في الرياضيات والحوسبة، فللعشوائية معنى دقيق: يُعدّ التسلسل عشوائياً إذا كانت معرفة جميع القيم السابقة لا تمنح أي ميزة في التنبؤ بالقيمة التالية. تحقيق عشوائية حقيقية في آلة حتمية أمر بالغ الصعوبة — فالحواسيب تتبع تعليمات دقيقة، وهو نقيض عدم القدرة على التنبؤ. تنقسم الحلول لهذه المشكلة إلى فئتين: مولِّدات الأعداد الشبه عشوائية (PRNGs) ومولِّدات الأعداد العشوائية الحقيقية (TRNGs).
الـ PRNG هو خوارزمية حتمية تنتج سلسلة من الأعداد تبدو عشوائية، لكنها محددة بالكامل من قِبَل قيمة ابتدائية تُسمى البذرة. بنفس البذرة، يُنتج الـ PRNG دائماً نفس التسلسل. قد يبدو هذا عيباً، لكنه في الواقع خاصية مفيدة في كثير من السياقات.
أكثر الـ PRNGs استخداماً في العصر الحديث هو Mersenne Twister، الذي تبلغ دورته 2^19937 − 1 (أي يُنتج هذا العدد من القيم قبل التكرار). يجتاز كل اختبارات العشوائية الإحصائية تقريباً. معظم دوال العشوائية العامة في لغات البرمجة — وحدة random في Python، وjava.util.Random في Java، وMath.random() في JavaScript — تستخدم PRNG تحت الغطاء.
القيد الجوهري: الـ PRNGs غير آمنة تشفيرياً. إذا تمكّن المهاجم من رصد عدد كافٍ من المخرجات، يستطيع إعادة بناء الحالة الداخلية والتنبؤ بجميع المخرجات المستقبلية. لا يجب استخدام الـ PRNGs في أي شيء يمس الأمن.
الـ CSPRNG هو PRNG مصمم ليكون التنبؤ به مستحيلاً حسابياً، حتى مع معرفة المخرجات السابقة. يحقق ذلك عبر دوال تشفير أحادية الاتجاه، ويُغذَّى من مصدر إنتروبيا حقيقية. توفر أنظمة التشغيل CSPRNGs عبر واجهات مثل /dev/urandom على Linux/macOS وCryptGenRandom على Windows.
في كود التطبيقات:
secrets (استخدمها، لا random، لكلمات المرور والرموز)crypto.randomBytes() وcrypto.randomUUID()window.crypto.getRandomValues()java.security.SecureRandomاستخدم دائماً واجهة الـ API التشفيرية العشوائية للعمليات الحساسة أمنياً: توليد كلمات المرور، والرموز، ومعرِّفات الجلسة، ومفاتيح API، والمفاتيح التشفيرية، والقِيَم الفردية (nonces).
تستمد الـ TRNGs العشوائية من عمليات فيزيائية غير متوقعة بحق: الضوضاء الحرارية في المكونات الإلكترونية، والتحلل الإشعاعي، وضوضاء الغلاف الجوي، وأوقات وصول الفوتونات. تتضمن وحدات أمان الأجهزة (HSMs) المستخدمة في البنوك وجهات الشهادات TRNGs. تولِّد خدمات مثل random.org أعداداً عشوائية من ضوضاء الغلاف الجوي، وكثيراً ما تُستخدم كمصادر عشوائية موثوقة للقرعات والمسابقات.
عادةً ما تُغذِّي الـ CSPRNGs في أنظمة التشغيل نفسها من مصادر إنتروبيا عتادية (توقيتات لوحة المفاتيح، وإدخال/إخراج القرص، وشرائح RNG عتادية كـ RDRAND من Intel) ثم تستخدم خوارزمية CSPRNG لتوسيع تلك الإنتروبيا إلى تيار. يمنح هذا النهج الهجين عدم القدرة على التنبؤ من الإنتروبيا العتادية مع سرعة التوليد البرمجي.
Math.random() أو ما يعادله لهذه الأغراض.حين يكون الاستنساخ مهماً — لإعادة إنشاء سيناريو اختبار محدد، أو مشاركة نتيجة توليد، أو تصحيح محاكاة — يمكنك تغذية PRNG بقيمة ثابتة للحصول دائماً على نفس المخرج. تستخدم كثير من الألعاب بذرة لتوليد العالم، مما يتيح للاعبين مشاركة البذور للحصول على خرائط مثيرة. كثيراً ما يُغذِّي باحثو التعلم الآلي مكتبات العشوائية في بداية تجربة لضمان استنساخية النتائج عبر عمليات التشغيل.
جودة البذرة مهمة أيضاً. الـ PRNG المُغذَّى بالطابع الزمني الحالي بالميلي ثانية قابل للتنبؤ إذا كان المهاجم يعرف تقريباً متى بدأ تطبيقك. لأغراض غير أمنية، البذرة الزمنية مقبولة عادةً؛ أما لأي شيء يجب أن يكون مخرجه غير قابل للتخمين، فاستخدم CSPRNG لتوليد البذرة.
افتح مولِّد الأعداد العشوائية المجاني — ولِّد عدداً واحداً أو أكثر من الأعداد العشوائية ضمن أي نطاق، مع تكرار أو بدونه. يعمل في متصفحك.