الحمد لله رب العالمين ...والصلاة والسلام على أشرف الخلق والمرسلين ..سيدنا محمد صلى الله عليه وسلم وعلى آله وأصحابه أجمعين
السلام عليكم ...
أثناء تتبعي لأحد البرامج في ++C ...
خطر على بالي أن أبحث عن جسم الدالة() rand ... وكنت عندها أفكر في أنني سأتعلم وأحاول فك خوارزمية العشوائية التي تنفذها ...
ولكن للأسف اكتشفت أنها تتبع علاقة رياضية ... واضحة .. ومعلومة النتائج مسبقاً ...
فالدالة rand تقوم بتعليمة واحدة فقط وهي :
return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
وكل استدعاء سيكون تابعا للاستدعاء السابق ...
حيث أن المتحول holdrand معرف كمتحول global ... ووظيفة srand تنحصر في تنفيذ التعليمة التالية :
holdrand = (long)seed;
أي اسناد الوسيط إلى المتحول holdrand
وبالتالي .. يمكننا القول أن أي اعتماد على عشوائية هذه الدوال هو اعتماد على عصا رفيعة تنكسر بسهولة ...
وهي ليست معقدة كما قال أخي العزيز أحمد الشنقيطي :
اقتباسالدالة التي سنستعملها هي الدالة rand وتوجد في المكتبة cstdlib , هذه الدالة تتبع خوارزمية مُعقدة بعض الشيء !!!
في هذه المقالة الرائعة له ...
كما أنه يمكن لأي هاوِ أن يكتب دالة أفضل منها ... على الأقل كمثال ...بحيث تتغير holdrand بعد كل استدعاء بدل أن تبقى محتفظة بالقيمة السابقة ...
فعدم حدوث ذلك يسهل بشكل كبير توقع النتيجة التالية ...
ربما اعتمدها المبرمجون لأنها لا تكرر الأرقام ولكن هذا غير صحيح فبعد استدعائها 145021636 مرة فإنها تعود لتوليد البذرة ...وتكرار الحلقة من البداية ....
لذلك أنصحكم بكتابة دوالكم العشوائية يدوياً ... فسيكون هذا أكثر عشوائية ...
والله ولي التوفيق


