“إنه عشوائي” ادعاء، وليس حقيقة. يجب أن يتحقق أمران ليكون الاختيار عادلًا: ألا يكون مصدر الأرقام قابلًا للتنبؤ، وأن تكون كل خيار متساوي الاحتمال.
كلا الأمرين قابل للتنفيذ، وكلا الأمرين يُخطئ فيه الناس كثيرًا، وكلاهما يفشل بشكل مستقل. يمكن أن تمتلك أداة مصدرًا عشوائيًا ممتازًا وتحويلًا متحيزًا، أو تحويلًا منتظمًا تمامًا تغذّيه أرقام قابلة للتنبؤ.
من أين تأتي العشوائية
تأتي العشوائية الحقيقية من عمليات فيزيائية لا تحددها حالة سابقة:
- التحلل الإشعاعي — لا يمكن التنبؤ بلحظة تحلل الذرة
- الضجيج الحراري — تقلبات جهد عشوائية في مقاومة
- الضجيج الجوي — تشويش خلفي ناتج عن نشاط البرق
- القياس الكمومي — نتائج غير محددة فعليًا
لا يستطيع الحاسوب ملاحظة هذه مباشرة. ما يفعله هو أخذ عيّنات من مولّد عتادي — /dev/urandom وما يماثله — وهو نفسه مبذور من عمليات فيزيائية. ذلك هو مولّد أرقام عشوائية حقيقي.
الحالة الأكثر شيوعًا بكثير هي مولّد أرقام شبه عشوائية: خوارزمية حتمية تنتج تسلسلًا يبدو عشوائيًا فقط.
next = (previous × multiplier + increment) mod modulus
الخاصية الحاسمة ليست خفية. إذا عرفت الخوارزمية والبذرة، يمكنك حساب كل قيمة سينتجها التسلسل يومًا ما. ليس تقريبًا — بل بدقة تامة. لهذا فإن Math.random()، الذي تستخدمه معظم المواقع، غير مناسب لأي أمر مهم: ناتجه تحدده حالة داخلية، واستعادة تلك الحالة من النواتج المرصودة تجعل كل نتيجة مستقبلية قابلة للتنبؤ.
الحل الوسط الذي يحسم المسألة
لا تستخدم المنصات الحديثة العشوائية العتادية الخام في كل نداء. بل تستخدم مولّد أرقام شبه عشوائية آمن تشفيريًا (CSPRNG) — حتمي، لكنه مبذور من عشوائية عتادية ومصمم بحيث لا يكشف رصد نواتجه عن الحالة.
| TRNG عتادي | CSPRNG | PRNG عادي | |
|---|---|---|---|
| قائم على عشوائية فيزيائية | نعم | نعم | لا |
| حتمي بالنظر إلى الحالة | لا | نعم | نعم |
| الناتج يكشف الحالة | لا | لا | نعم |
| مناسب لسحب جائزة | نعم | نعم | لا |
مولّد CSPRNG حتمي بالمعنى نفسه الذي تكون فيه كل قطعة برمجية تستخدمها حتمية. ما يجعله مقبولًا هو أن حالته لا يمكن استعادتها مما أصدره بالفعل.
تكشف المتصفحات عن هذا عبر crypto.getRandomValues(). وهو المصدر الذي تستخدمه السحوبات هنا.
الانتظام مشكلة منفصلة
وجود مصدر جيد لا يكفي. يمكن أن يظل التحويل من رقم عشوائي إلى خيار متحيزًا، وهذا هو الخطأ الذي تقع فيه معظم الأدوات.

الطريقة الساذجة — تحجيم عدد عشري عشوائي من 0 إلى 1 على المدى — تحيّز الطرف الأدنى. مع 40 اسمًا، تقع بعض القيم العشوائية بعد نهاية الدلو الأخير، وإذا حُصرت بدلًا من تجاهلها، يظهر الاسم الأول أكثر قليلًا من الأخير.
التحيز صغير بما يكفي ألا يلاحظه أحد، وهذا تحديدًا سبب بقائه في معظم التطبيقات.
الطريقة الصحيحة هي أخذ العينات بالرفض: اسحب، وإذا وقعت النتيجة في الدلو الأخير غير المكتمل، تجاهلها واسحب مرة أخرى. يصبح التوزيع منتظمًا تمامًا، فيحصل كل مدخل على فرصة 1/N — بما في ذلك في سحب من 40 اسمًا حيث يمنح تطبيق تحجيم العدد العشري الاسم الأول احتمالًا أعلى قليلًا جدًا.
تظهر التقنية نفسها في مولّد المعرّفات القصيرة هنا، حيث معدل القبول 252/256 والتحيز الناتج نحو جزأين من كل عشرة ملايين. صغير بما يكفي ليكون غير ذي صلة، وصغير بما يكفي لأن يمر تطبيق مهمل دون أن يُلاحظ — وهذا بالضبط سبب استحقاقه للقياس.
ثلاث أخطاء بشرية ليست خطأ الأداة
مغالطة المقامر. بعد خمس صور متتالية، يبدو أن الكتابة “حان وقتها”. كل سحب مستقل. لا تتذكر العملة أنها كانت غير عادلة، والاحتمال الصحيح بعد خمس صور لا يزال 1/6 لكل وجه تمامًا.
وهم التجمّع. تبدو السلاسل في البيانات العشوائية ذات نمط لأنك تبحث عنها. ثلاث نتائج متطابقة متتالية تحدث أكثر بكثير مما يوحي الحدس. والبيانات العشوائية حقًا تبدو متكتلة على المدى القصير — والتسلسل الذي يبدو منتظمًا تمامًا أكثر احتمالًا أن يكون مُلفّقًا من أن يكون حقيقيًا.
مفارقة أعياد الميلاد. في مجموعة من 23 شخصًا، من المرجح أن يشترك اثنان في تاريخ الميلاد. هذه حساب، لا علم نفس، لكنها توضح لماذا يخطئ الناس كثيرًا في تقدير العشوائية: الاحتمالات الفردية ضئيلة وتتراكم بالضرب.
الخيط المشترك هو أن ملاحظة واحدة لا تثبت شيئًا، في أي من الاتجاهين. سحب بدا غريبًا لا يحمل معلومة أكثر من سحب بدا مرتبًا.
الفشلان الأكثر أهمية في الممارسة
بعد تتبّع الآلية، يجدر تسمية ما يخطئ فعليًا عندما يُطعن في اختيار — ولا يتعلق أي منهما بالمصدر.
تجاوز المشغّل للنتيجة. إعادة السحب، أو التصحيح اليدوي، أو تخطي اسم غائب أثناء السحب. مولّد مثالي ونتيجة معدّلة تبقى نتيجة معدّلة، وهي مرئية لأي شخص شاهد.
المجموعة لم تكن المجموعة المعلنة. إضافة اسم، أو استثناء آخر بهدوء، يغيّر الاختيار بغض النظر عن الخوارزمية.
كلاهما فشل في العملية، وكلاهما ما يمنعه سحب مسجّل. لهذا فإن التسجيل مع ظهور قائمة المشاركين في الإطار يفوق قيمة أي خاصية تقنية: فهو يسدّ الباب على كليهما.
أين يستحق هذا القدر من الصرامة
لاختيار وجبة غداء، لا يهم أي من هذا. أي مولّد ينتج غداءً مقبولًا.
يصبح الأمر حاملًا للوزن عندما تكون هناك مصلحة، أو سمعة، أو بُعد قانوني:
- سحوبات الجوائز والمسابقات. النتيجة القابلة للتحقق هي المقصد
- تعيين الموظفين أو المهام. سيفحص الناس العملية
- التوزيع العشوائي العلمي والسريري. معيار المجال هو عشوائية موثّقة ومبذورة وقابلة لإعادة الإنتاج
- سياقات التنظيم والتدقيق. غالبًا ما تكون العشوائية الموثّقة متطلبًا، لا تفضيلًا
المتطلبات في كل هذه هي الأربعة نفسها، وهي قصيرة: المجموعة ثابتة ومعلنة، والأوزان معلنة إن وُجدت، والمصدر غير قابل للتنبؤ، والنتيجة مسجّلة مع ظهور المجموعة.
كيف تتحقق بنفسك
لا يمكنك تدقيق CSPRNG في تبويب متصفح، لكن يمكنك التفكير في الآلية، وهذا يكفي.
اسأل ما هو المصدر. إذا كان الجواب “دالة عشوائية”، اسأل إن كانت هي الدالة القابلة للتنبؤ. crypto.getRandomValues() جواب محدد وقابل للفحص.
اسأل كيف يُحقّق الانتظام. إذا تضمّن الجواب تحجيم عدد عشري على مدى دون ذكر أخذ العينات بالرفض، فالتحويل على الأرجح متحيز. بقدر صغير، لكن قابل للقياس.
اسأل ما الذي كان يمكن للمشغّل تغييره. إذا لم يكن هناك شيء، فالنتيجة قابلة للدفاع. أما إذا كان يمكن تخطي اسم أو إعادة السحب، فهي ليست كذلك — بغض النظر عن المصدر.
تغطي صفحة النزاهة التطبيق على هذا الموقع بمزيد من التفصيل. تستحق قراءة واحدة إذا كنت تختار أداة لقرار سيُطعن فيه.