انحياز المودولو: خطأ في سطر واحد يجعل الاختيار العشوائي غير متساوٍ دون أي استثناء
المغزى: أخطر الأخطاء هي التي لا ترفع استثناءً، فالكود يعمل والمخرجات تبدو عشوائية، والانحياز لا يظهر إلا في الإنتاج بعد شهور على شكل خيار يتكرر أكثر من غيره.
نشر المهندس Austin Seipp في 6 أكتوبر 2026 مقالًا عن خطأ شائع في كود الاختيار العشوائي، يجعل النتائج منحازة دون أن يظهر أي خطأ. ويكتب Seipp من تجربته في Antithesis، وهي أداة fuzzing حتمية، أي أداة تختبر البرامج بمدخلات عشوائية يمكن إعادة توليدها بالترتيب نفسه.
والمثال الذي يقدمه بسيط. لدى المبرمج رقم عشوائي بين 0 و9، ويريد اختيار واحد من ثلاثة خيارات، فيكتب r % 3، أي باقي قسمة الرقم على 3.
والنتيجة ليست ثلثًا لكل خيار. فالأرقام 0 و3 و6 و9 يكون باقيها صفرًا، فتذهب أربعة أرقام إلى الخيار الأول. أما الأرقام 1 و4 و7 فتذهب إلى الثاني، و2 و5 و8 إلى الثالث، بثلاثة أرقام لكل منهما. فيحصل الخيار الأول على 40% من الحالات، والآخران على 30% لكل واحد.
والسبب أن عدد القيم الممكنة، وهو 10، لا يقبل القسمة على 3. فتبقى قيمة زائدة تذهب دائمًا إلى الخيار الأول. ويسمى هذا انحياز المودولو (modulo bias).
ولا يكتشف الاختبار العادي هذا الخطأ. فالكود يعمل، والمخرجات تبدو عشوائية لمن ينظر إليها. والانحياز لا يظهر إلا بعد عدد كبير من التشغيلات، غالبًا في الإنتاج بعد شهور، في صورة خيار يتكرر أكثر من غيره.
ولا يقترح Seipp تصحيح الحساب يدويًا، بل رفع مستوى التجريد. فبدل استدعاء random_u64() وكتابة القسمة، يستدعي المبرمج دالة اختيار موزون مثل random_choice() ويحدد فيها النسب صراحة. وفي مثاله تكون الأوزان 4 و3 و3. وبهذا تصبح النسبة مكتوبة في الكود ويراها كل من يقرؤه، بدل أن تكون نتيجة جانبية لعملية حسابية لم يتوقف عندها أحد.