مشاهدة النسخة كاملة : ''ترجمة''1'' شرح تفصيلي لكيفية توليد الأرقام العشوائية باستخدام لغة سي ++


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

منطلق بطموحي
05-01-2006, 11:08 AM
السلام عليكم:

شكرا لك على الموضوع المهم

لدي مداخلة بسيطة (للاسف لم افهم الحدود اذ ظهرت بشكل غير مفهوم)

لكن هناك قانون بسيط لتوليد الارقام العشوائية هو :

n=shifting value+rand()%scaling factor

مثلا لتوليد ارقام من -20 الى 100 نقوم بالتالي:

100--20 +1 =121

اذا

-20+rand()%121

يمكن اخذ مثال اكثرتعقيدا او ربما بشكل مختلف

نريد عمل معادلة عشوائية فقط تعطكينا القيم التالية:

10,20,30,40,50

نلاحظ ان 10=10 + 10*0
20=10+10*1
30=10+10*2

اذا

10+10*(rand()%5);

ال 5 هنا لان القيم تتغير من 0 الى 4 اذا 4-0+1

( نجمع الواحد لان المعادلة rand()%n قيمها من الصفر حتى n-1 (

مثال اخر به دوال:

اكتب دالة عشوائية تعطي القيم التالية فقط : 3و9و27و81

تلاحظون ان 3=3*3^0 و 9=3*3^1 و هكذا

اذا تتغيرالقيم من 0 حتى 3 اذا

3*pow(3,rand()%4);

----

اشكرك مجددا على الموضوع و اترك الفرصة للاعضاء لحل الاسئلة

bindigi01
08-01-2006, 03:53 PM
السلام عليكم و رحمة الله

جزاك الله خيرا على الشرح ولكن
(random number generator is an algorithm)
لا استطيع فهم معادلاته وارجو لو تساعدنا على ذلك
:)