digitaleagle
05-01-2006, 05:42 AM
مُوَّلد الأرقام العشوائية
Random Number Generator
سنناقش بهذا الموضوع استخدام مُوَّلد الأرقام االعشوائية بلغة C++ وأهمية هذه التعليمة حيث أن كل الالعاب التي تعتمد على الحظ مثل النرد و العاب الكازينوهات تعتمد على توليد ارقام عشوائية.
هناك التعليمة الجاهزة الموجودة بكتبة ال C++ <cstdlib> و هي rand() و التي تعيد الرقم العشوائي أي اننا نستخدمها كما يلي
i = rand();
تقوم هذه التعليمة باعادة رقم عشوائي صحيح موجب unsigned ابتداءً من 0 و حتى 32767 يا هل ترى تعرفون سر هذا الرقم! بسيطة أنا أقول لكم إنه أكبر رقم صحيح موجب يتم انتاجه من 2byte أو 16bit و بإمكانك تجربة ذلك!
إذا كانت حقيقة انتاج رقم عشوائية كما أقول فإن فرصة ظهور رقم بين الصفر و العدد الأقصى ستكون متساوية و هذا هو مبدأ العشوائية rand . لكن هل سيتم اظهار رقم عشوائي من هذا المدى الكبير ... بالطبع لا و ان الذي يحكم ظهور الارقام التطبيق حيث أن لكل تطبيق ما يلزمه فمثلا :- الارقام العشوائية التي تلزم ل برنامج يمثل دور رمي قطعة العملة بحاجة لرقمين الاول يمثل الصورة (0) و الاخر يمثل الكتابة (1) و البرنامج الذي يمثل رمي قطة النرد بحاجة لستو ارقام من 0-6.
من يحدد هذه المعادلة بالرمجة هو اشارة بسيطة تعيد باقي القسمة و هي mod أو % حيث أن باقي القسمة على 2 سيكون 1 or 0 و باقي القسمة على 6 سيكون 0-5 و بذلك يكون تحدد المدى الذي سينتج منه الرقم العشوائي و حسب رغبة المبرمج و التطبيق i = rand() % 6.
و اليك البرنامج التالي الذي يوضح ما سبق
#include<iostream.h>
#include<iomanip>
#include<cstdlib>
main()
**
for (int i = 1; i<20; i++)
**
cout<<setw(10) << ( 1+ rand() % 6 ) ;
if( i % 5 == 0 )
**
cout<< endl;
}
}
}
كما هو مبين في السطر الثامن فقد تم استخدام تعليمة الارقام العشوائية بحيث تظهر الارقام من باقي القسمة على 6 أي من (0-5) لكن قمنا باضافة 1 لطرفي الحدود لكي تصبح من (1-6) و بذلك تتحقق شروط حجر النرد المكون من الارقام 1-6 ويكون ناتج التنفيذ كما هو موضح ادناه مع مراعاه ان النتيجة تختلف من جهاز لاخر و من تنفيذ لاخر وإن باقي التعليمات الأخرى التي بالبرنامج هي لتزيين اخراجه فقط ليس الا.
6 6 5 5 6
5 1 1 5 3
6 6 2 4 2
6 2 3 4 1
طيب الان فهمنا مفهوم انتاج ارقام عشوائية و تحديد حدوده الدنيا و القصوى بمبدأ الازاحة و لك سؤال عزيزي و أخي القارئ كيف ستجعل نفس البرنامج بتعديل بسيط في الفترة (10-60) فكر وأتني بالجواب انها عملية سهلة بامكانك أن تفكر بها! و لتصعيب المهمة بعد حل اللغز قم بحعل الفترة (40-45)، فهل ستعرف الجواب!
هناك قضية مهمة و هي أنه لو تم تنفيذ نفس البرنامج عشرات المرات على نفس الجهاز و بدون اغلاقه و فتحة من جديد ستلاحظ ان ناتجاً متشابهاً يخرج و هذه مشكلة بحاجة لحل، في الحقيقة إن تعليمةrand() تتبع خوارزمية معينة و بالتالي ان ناتج الخوارزمية سيكون متشابها لكن عباقرة و منتجي لغة C++ قاموا بحل المشكلة باختراع تعليمة srand() التي تستخدم لانتاج أرقام عشوائية بشكل عشوائي مئة بالمئة. و اليك كيفية استخدامها
main()
**
unsigned s;
cout << " enter s variable " ;
cin >> s ;
srand(s);
for (int i = 1; i<20; i++)
**
cout<<setw(10) << ( 1+ rand() % 6 ) ;
if( i % 5 == 0 )
**
cout<< endl;
}
}
}
و سترى من خلال تنفيذ البرنامج أن الأمور أصبحت تمام.
لكن اذا كان التطبيق الذي ترغب بعمله لا يحتمل ان يقوم المستخدم بادخال رقم مثل المتغير s الذي استخدم بالبرنامج اعلاه كل المطلوب منك عمل التالي
srand(time(0))
و سترى ان الامور تمام لكن لا تنسى اضافة مكتبة الوقت #include<ctime> و يا هلا فيكم .
و الان أقدم أسئلة لتقوم عزيزي القارئ بحلها لكي تتأكد من أنك قد استفدت من هذا الموضوع
a) what does it mean to choose numbers as " random " ما معنى اختيار رقم عشوائي
b) why is the rand function useful for simulating games of chanc? لماذا تعتبر التعليمة ممتازة لتمثيل (محاكاه) العاب الحظ؟
c) why would you randamize a program by using srand()? Under what circumantances is it describe not to randomize?
لماذا تحتاج للبرمجة باستخدام srand و ما هي الشروط التي تجعلها تبدو غير عشوائية؟
d) write statements that assign random integers to variable n in the following ranges
قم بكتابة جمل تقوم بتعيين أرقام عشوائية للمتغير n ضمن الحدود التالية
1- 1<= n <= 2
2- 1<= n <= 100
3- 1000<= n <= 1112
4- -1 <= n <= 1
5- -3 <= n <= 11
لا تخافوا يا أصدقاء سأقوم بطرح الحلول قريباً لكن يجب أن تأخذوا فرصة للتجربة.
تمت الترجمة و التلخيص من كتاب
C++ how to program 4th editin
للكاتب
deitel
Random Number Generator
سنناقش بهذا الموضوع استخدام مُوَّلد الأرقام االعشوائية بلغة C++ وأهمية هذه التعليمة حيث أن كل الالعاب التي تعتمد على الحظ مثل النرد و العاب الكازينوهات تعتمد على توليد ارقام عشوائية.
هناك التعليمة الجاهزة الموجودة بكتبة ال C++ <cstdlib> و هي rand() و التي تعيد الرقم العشوائي أي اننا نستخدمها كما يلي
i = rand();
تقوم هذه التعليمة باعادة رقم عشوائي صحيح موجب unsigned ابتداءً من 0 و حتى 32767 يا هل ترى تعرفون سر هذا الرقم! بسيطة أنا أقول لكم إنه أكبر رقم صحيح موجب يتم انتاجه من 2byte أو 16bit و بإمكانك تجربة ذلك!
إذا كانت حقيقة انتاج رقم عشوائية كما أقول فإن فرصة ظهور رقم بين الصفر و العدد الأقصى ستكون متساوية و هذا هو مبدأ العشوائية rand . لكن هل سيتم اظهار رقم عشوائي من هذا المدى الكبير ... بالطبع لا و ان الذي يحكم ظهور الارقام التطبيق حيث أن لكل تطبيق ما يلزمه فمثلا :- الارقام العشوائية التي تلزم ل برنامج يمثل دور رمي قطعة العملة بحاجة لرقمين الاول يمثل الصورة (0) و الاخر يمثل الكتابة (1) و البرنامج الذي يمثل رمي قطة النرد بحاجة لستو ارقام من 0-6.
من يحدد هذه المعادلة بالرمجة هو اشارة بسيطة تعيد باقي القسمة و هي mod أو % حيث أن باقي القسمة على 2 سيكون 1 or 0 و باقي القسمة على 6 سيكون 0-5 و بذلك يكون تحدد المدى الذي سينتج منه الرقم العشوائي و حسب رغبة المبرمج و التطبيق i = rand() % 6.
و اليك البرنامج التالي الذي يوضح ما سبق
#include<iostream.h>
#include<iomanip>
#include<cstdlib>
main()
**
for (int i = 1; i<20; i++)
**
cout<<setw(10) << ( 1+ rand() % 6 ) ;
if( i % 5 == 0 )
**
cout<< endl;
}
}
}
كما هو مبين في السطر الثامن فقد تم استخدام تعليمة الارقام العشوائية بحيث تظهر الارقام من باقي القسمة على 6 أي من (0-5) لكن قمنا باضافة 1 لطرفي الحدود لكي تصبح من (1-6) و بذلك تتحقق شروط حجر النرد المكون من الارقام 1-6 ويكون ناتج التنفيذ كما هو موضح ادناه مع مراعاه ان النتيجة تختلف من جهاز لاخر و من تنفيذ لاخر وإن باقي التعليمات الأخرى التي بالبرنامج هي لتزيين اخراجه فقط ليس الا.
6 6 5 5 6
5 1 1 5 3
6 6 2 4 2
6 2 3 4 1
طيب الان فهمنا مفهوم انتاج ارقام عشوائية و تحديد حدوده الدنيا و القصوى بمبدأ الازاحة و لك سؤال عزيزي و أخي القارئ كيف ستجعل نفس البرنامج بتعديل بسيط في الفترة (10-60) فكر وأتني بالجواب انها عملية سهلة بامكانك أن تفكر بها! و لتصعيب المهمة بعد حل اللغز قم بحعل الفترة (40-45)، فهل ستعرف الجواب!
هناك قضية مهمة و هي أنه لو تم تنفيذ نفس البرنامج عشرات المرات على نفس الجهاز و بدون اغلاقه و فتحة من جديد ستلاحظ ان ناتجاً متشابهاً يخرج و هذه مشكلة بحاجة لحل، في الحقيقة إن تعليمةrand() تتبع خوارزمية معينة و بالتالي ان ناتج الخوارزمية سيكون متشابها لكن عباقرة و منتجي لغة C++ قاموا بحل المشكلة باختراع تعليمة srand() التي تستخدم لانتاج أرقام عشوائية بشكل عشوائي مئة بالمئة. و اليك كيفية استخدامها
main()
**
unsigned s;
cout << " enter s variable " ;
cin >> s ;
srand(s);
for (int i = 1; i<20; i++)
**
cout<<setw(10) << ( 1+ rand() % 6 ) ;
if( i % 5 == 0 )
**
cout<< endl;
}
}
}
و سترى من خلال تنفيذ البرنامج أن الأمور أصبحت تمام.
لكن اذا كان التطبيق الذي ترغب بعمله لا يحتمل ان يقوم المستخدم بادخال رقم مثل المتغير s الذي استخدم بالبرنامج اعلاه كل المطلوب منك عمل التالي
srand(time(0))
و سترى ان الامور تمام لكن لا تنسى اضافة مكتبة الوقت #include<ctime> و يا هلا فيكم .
و الان أقدم أسئلة لتقوم عزيزي القارئ بحلها لكي تتأكد من أنك قد استفدت من هذا الموضوع
a) what does it mean to choose numbers as " random " ما معنى اختيار رقم عشوائي
b) why is the rand function useful for simulating games of chanc? لماذا تعتبر التعليمة ممتازة لتمثيل (محاكاه) العاب الحظ؟
c) why would you randamize a program by using srand()? Under what circumantances is it describe not to randomize?
لماذا تحتاج للبرمجة باستخدام srand و ما هي الشروط التي تجعلها تبدو غير عشوائية؟
d) write statements that assign random integers to variable n in the following ranges
قم بكتابة جمل تقوم بتعيين أرقام عشوائية للمتغير n ضمن الحدود التالية
1- 1<= n <= 2
2- 1<= n <= 100
3- 1000<= n <= 1112
4- -1 <= n <= 1
5- -3 <= n <= 11
لا تخافوا يا أصدقاء سأقوم بطرح الحلول قريباً لكن يجب أن تأخذوا فرصة للتجربة.
تمت الترجمة و التلخيص من كتاب
C++ how to program 4th editin
للكاتب
deitel