نمط برمجي شائع يختار عناصر عشوائية باستخدام المودولو: `choices[random_u64() % n]`. يبدو هذا بديهيًا لكنه يُدخل تحيزًا إحصائيًا لأن النطاق العشوائي نادرًا ما يُقسم بالتساوي على عدد الخيارات.
على سبيل المثال، عند الاختيار من بين 3 عناصر باستخدام رقم عشوائي في النطاق [0, 9]، يحصل الخيار 1 على 4 مدخلات (0، 3، 6، 9) بينما يحصل كل من الخيارين 2 و 3 على 3 مدخلات فقط. يظهر الخيار 1 بنسبة 40% من الوقت بدلًا من النسبة المتوقعة 33.3%. يحدث هذا التحيز باستخدام المودولو كلما لم يكن النطاق العشوائي مضاعفًا لعدد الخيارات.
النهج الصحيح يستخدم `random_between(l, h)` الذي يوزع الاحتمال بشكل صحيح، على الرغم من أن تنفيذه أكثر تعقيدًا. سيوفر تصميم API أفضل وظائف على مستوى أعلى مثل `random_choice()` التي تقبل توزيعات احتمال صريحة، مما يجبر المطورين على مواجهة متطلبات التوزيع مباشرة بدلاً من الاعتماد على primitives منخفضة المستوى معيبة.
المصدر: Hacker News · لخّصه HeadlinesBriefing