عادة إذا أراد المبرمج توليد أرقام عشوائية فإنه يستخدم الدالة Rnd فإذا أراد مثلا توليد أرقام من صفر حتى 10 فإنه يكتب الأمر
Int(Rnd()*10)
لكن ماذا إذا أردنا تكوين 11 رقم من صفر حتى 10 دون أن يتكرر أي واحد منهم
في هذه الحالة استخدام الدالة Rnd وحده لا يكفي وعادة ما يقوم المبرمج باستدعاء الدالة ومقارنتها بالقيم السابقة ليتأكد أن القيمة لم تتكرر
هذا الأمر يتطلب كود أكبر وزمن أكبر لتوليد الأرقام مما يجعل هذه الطريقة غير فعالة
لكن في واقع الأمر هناك نظرية عددية يمكن استخدامها لهذا الغرض مع ضمان عدم تكرار الأعداد دون الحاجة إلى إجراء عملية المقارنة السابقة
النظرية تقول -هذه الصياغة من عندي لأني لا أعرف الصياغة الأصلية للنظرية فقد أخبرني بها أحد أصدقائي منذ زمن-:
إذا كان لديك عدد أولي n وعدد آخر r لا يقبل القسمة على n فإن باقي قسمة r ومضاعفاتها على n من r وحتى n*r تولد أرقاما من 0 حتى n-1 دون تكرار
على سبيل المثال نأخذ العدد الأولي 7 ونأخذ r=3
3 mod 7 =3 6 mod 7 =6 9 mod 7 =2 12 mod 7 =5 15 mod 7 =1 18 mod 7 =4 21 mod 7 =0
لاحظ أن الأعداد المتولدة تكون من 0 وحتى 7-1 ولم يتكرر أي واحد منها
المهم أن n يجب أن تكون عدد أولي و r يجب ألا تقبل القسمة على n
وقد قمت بإثبات هذه النظرية بنفسي ومتأكد منها تماما
طبعا يمكن توليد العدد r باستخدام الدالة Rnd مع اختبار باقي قسمته على n



