اشترِ لي قهوة
العودة للمدونة
Education

العشوائية الحقيقية مقابل شبه العشوائية: ما يهم فعليًا

Random Select Team•2026-04-01•7 min

اضغط زرًا، فيظهر رقم، ويُفترض أنه عشوائي. السؤال الذي يستحق الطرح هو ما الذي أنتجه — لأن أحد الجوابين قابل للتحقق والآخر لا.

من أين تأتي العشوائية الحقيقية

تأتي العشوائية الحقيقية من عمليات فيزيائية لا تحددها حالة سابقة:

  • التحلل الإشعاعي — لا يمكن التنبؤ باللحظة الدقيقة لتحلل الذرة
  • الضجيج الحراري — تقلبات جهد عشوائية في مقاومة
  • الضجيج الجوي — التشويش الخلفي لنشاط البرق
  • القياس الكمومي — نتائج غير محددة فعليًا

هذه ليست تقريبات للعشوائية. إنها عشوائية، بمعنى أن أي قدر من المعرفة بالماضي لا يحدد النتيجة.

ما الذي يفعله الحاسوب بدلًا من ذلك

لا يستطيع الحاسوب ملاحظة أي من هذه مباشرة، لذا يأخذ مولّد عتادي عيّنات منها. تأتي البايتات الخام من شيء مثل /dev/urandom أو مصدر نظام التشغيل المكافئ، وهو نفسه مبذور من عمليات فيزيائية. ذلك مولّد أرقام عشوائية حقيقي.

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

next = (previous × multiplier + increment) mod modulus

الخاصية الحاسمة ليست خفية. إذا عرفت الخوارزمية والبذرة، يمكنك حساب كل قيمة سينتجها التسلسل يومًا ما. ليس تقريبًا — بل بدقة تامة.

لهذا فإن Math.random()، الذي تستخدمه كل المواقع تقريبًا، غير مناسب لأي أمر مهم. ناتجه تحدده حالة داخلية. استعد تلك الحالة من النواتج المرصودة فتصبح كل رمية مستقبلية قابلة للتنبؤ.

المثال الأكثر استشهادًا هو أن الحالة الكاملة لمولّد متطابق خطي يمكن استعادتها من حفنة من النواتج المتتالية. يحتاج Mersenne Twister، الافتراضي في Python، إلى 624 ناتجًا لإعادة البناء — و624 رقم تصل إليه في ثوانٍ.

ولـ Xorshift والمولّدات السريعة المشابهة الخاصية نفسها بصيغة مختلفة: جودة إحصائية ممتازة، وقابلية تامة للتنبؤ إذا كانت لديك الحالة.

الحل الوسط الذي يهم فعليًا

هذا هو الجزء الذي تتخطاه معظم الشروحات، وهو الجزء الذي يحسم الجواب عمليًا.

رقم عشوائي وُلّد بواسطة الأداة

لا تستخدم منصات الويب الحديثة /dev/urandom الخام في كل نداء. بل تستخدم مولّد أرقام شبه عشوائية آمن تشفيريًا (CSPRNG) — خوارزمية حتمية، لكنها مبذورة من عشوائية عتادية ومصممة بحيث لا يتيح لك رصد النواتج استعادة الحالة.

يجدر الدقة في التمييز، لأن الاثنين يُخلطان:

TRNG عتادي CSPRNG PRNG عادي
قائم على عشوائية فيزيائية نعم نعم لا
حتمي بالنظر إلى الحالة لا نعم نعم
الناتج يكشف الحالة لا لا نعم
مناسب لسحب جائزة نعم نعم لا

مولّد CSPRNG حتمي بالمعنى نفسه الذي تكون فيه كل قطعة برمجية تستخدمها حتمية. ما يجعله مقبولًا هو أن حالته لا يمكن استعادتها مما أصدره بالفعل.

تكشف المتصفحات عن هذا بالضبط عبر crypto.getRandomValues(). وهو المصدر الذي تسحب منه RandomSelect.

العدالة سؤال ثانٍ

يسهل الخطأ في الانتظام حتى مع مصدر جيد. النرد d6 واضح: ست قيم متساوية الاحتمال. أما d7 فليس كذلك، وكذلك “اختر 1 من 40 اسمًا”.

الطريقة الساذجة — تحجيم عدد عشري عشوائي من 0 إلى 1 على المدى — تحيّز الطرف الأدنى. مع 40 اسمًا، يظهر الأول أكثر قليلًا من الأخير، لأن بعض القيم العشوائية تقع بعد نهاية الدلو الأخير وتُتجاهل بشكل غير متساوٍ.

الطريقة الصحيحة هي أخذ العينات بالرفض: اسحب، وإذا وقعت النتيجة في الدلو الأخير غير المكتمل، تجاهلها واسحب مرة أخرى. يصبح التوزيع منتظمًا تمامًا.

يسهل التغاضي عن هذا لأن التحيز صغير. عمليًا، يتجاهل التطبيق القيم خارج المدى ويعيد السحب، فيحصل كل مدخل على فرصة 1/N بالضبط — بما في ذلك في سحب من 40 اسمًا، حيث يمنح تطبيق تحجيم العدد العشري الاسم الأول احتمالًا أعلى قليلًا جدًا.

تظهر التقنية نفسها في مولّد المعرّفات القصيرة، حيث تلاحظ التعليقات في الشيفرة معدل القبول والتحيز الناتج نحو جزأين من كل عشرة ملايين. صغير بما يكفي ليكون غير ذي صلة، وصغير بما يكفي لأن يمر تطبيق مهمل دون أن يُلاحظ — وهذا بالضبط مقصد قياسه.

ماذا يعني هذا عمليًا

لاختيار وجبة غداء، لا يهم أي من هذا. أي مولّد ينتج غداءً مقبولًا.

بالنسبة لسحب جائزة، أو تعيين موظف، أو أي شيء تتعلق به سمعة، فالسؤال هو هل كان يمكن توقّع الناتج. مع Math.random() كان ذلك ممكنًا مبدئيًا. مع crypto.getRandomValues() لا يمكن — وهو فرق بين “نقول إنه كان عشوائيًا” و“الآلية تجعله كذلك”.

هناك نقطة ذات صلة وغالبًا ما تُخلط تتعلق بالرسوم المتحركة. على عجلة دوّارة، تُثبَّت النتيجة قبل أن تبدأ العجلة بالحركة؛ والرسوم تتحرك نحوها. يأخذ بعض القراء ذلك كدليل على التلاعب. والأمر على العكس: لأن النتيجة محددة مسبقًا ولا يمكن التأثير عليها بالتوقيت، لا يوجد مدخل يمكن لأحد استغلاله. البصري مسرح فوق قيمة محددة سلفًا.

اختباره بنفسك

تمرين سريع لا يحتاج إلى شيفرة: ارمِ نردًا عشرين مرة ودوّن النتائج. ثم ابحث عن السلاسل.

ستجدها. ثلاث ستات متتالية تحدث نحو مرة كل خمسين رمية. هذا ليس دليلًا على أن النرد محمّل — بل هذا ما تبدو عليه عملية عادلة عندما تفحص عيّنة قصيرة.

ثم ارمِ مئة مرة وعُدّ كل وجه. تضيق الفجوات. لا أحد يتقارب، لأنه لم يكن هناك عجز ليُسدّ أصلًا: هذا ما يعنيه الاستقلال عندما تنظر عن قرب كافٍ.

أين تقرأ المزيد

تستعرض صفحة النزاهة على هذا الموقع التطبيق الفعلي، بما في ذلك خطوة أخذ العينات بالرفض. تستحق قراءة واحدة، خصوصًا إذا كنت تختار أداة لقرار سيُطعن فيه.

الخلاصة العملية قصيرة: الأداة التي تستخدم crypto.getRandomValues() وترفض السحوبات خارج المدى تفعل الصواب، ولست مضطرًا لأخذ كلامها على عينه — يمكنك التفكير في الآلية بدلًا من ذلك.

RST

Random Select Team

محلل بيانات خبير ومنظّر ألعاب في Random Select. أكثر من 10 سنوات من الخبرة في العدالة الرقمية ورياضيات الاحتمال وأنظمة اتخاذ القرار العشوائي.

شارك هذا المقال