++C تولید اعداد تصادفی در

توليد اعداد تصادفی<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

يکی از کاربردهای اساسی کامپيوتر، استفاده از آن در کارهای شبيه سازی می باشد. در اينجا به بررسی نحوه توليد اعداد تصادفی می پردازيم. اعداد تصادفی در مسائل شبيه سازی کاربرد فراوانی دارند، به عنوان مثال شبيه سازی پرتاب سکه، پرتاب تاس و مسائلی از اين قبيل.

برای توليد اعداد تصادفی زبان ++C تابعی با نام rand() را که در فايل کتابخانه ای stdlib.h قرار دارد، در اختيار ما گذاشته است. به عنوان مثال دستور زير :

i = rand();

يک عدد تصادفی بين 1 تا 32767 را در متغير i قرار می دهد . تابعrand()اعداد را با احتمال مساوی در اين بازه انتخاب می کند پس شانس انتخاب هر عددی در اين بازه با اعداد ديگر برابر است.

معمولاً بازه اعدادی که توسط تابع rand توليد می شود، با آنچه که مورد نياز ماست متفاوت می باشد. به عنوان مثال برای شبيه سازی پرتاب سکه به دو عدد تصادفی و برای تاس به شش عدد تصادفی نياز داريم. فرض کنيد که می خواهيد عدد 31250 را به عددی بين 1 تا 6 تبديل کنيد. چه راه کاری را در نظر می گيريد؟ راهی که برای اين تبديل وجود دارد استفاده از باقيمانده صحيح می باشد، همانطور که می دانيد باقيمانده صحيح تقسيم هر عددی بر 6 يکی از اعداد 0 تا 5 می باشد. پس با اضافه کردن 1 واحد به باقيمانده ، عددی بين 1 تا 6 خواهيم داشت. به عنوان مثال در کادر زير عددی بين 1 تا 32767 وارد کنيد و با کليک بر روی دکمه محاسبه خروجی ، نتيجه محاسبه را ببينيد :

 

Top of Form

a=
a%6+1=

Bottom of Form

حال اگر به جای متغير a ، تابع rand() را قرار دهيم عبارت rand()%6+1 عددی تصادفی بين 1 تا 6 به ما می دهد به طور کلی برای بدست آوردن عددی تصادفی در بازه [a,b] می توانيم از فرمول زير استفاده کنيم.

rand()%(b-a+1)+a

به عنوان مثال خروجی قطعه برنامه زير عدد صحيحی در بازه [20,100] می باشد.

int a = 20 , b = 100;

cout<< rand()%(b-a+1)+a;

برنامه زير 20 عدد تصادفی بين 1 تا 6 را ايجاد می کند. که اين برنامه را می توان 20 بار پرتاب يک تاس در  نظر گرفت :

#include

#include

 

int main()

{

   for (int i = 1; i<= 20; i++ )

    {

     cout << rand() % 6 + 1<<"\t";

 

     if ( i % 5 == 0 )

        cout << endl;

    }

   return 0;

}

خروجی برنامه فوق به صورت زير می باشد :

5       5       3       5       5

2       4       2       5       5

5       3       2       2       1

5       1       4       6       4

يک بار ديگر برنامه فوق را اجرا کنيد و خروجی را مجدداً بررسی کنيد. خواهيد ديد خروجی دقيقاً همان اعداد قبلی می باشد. خروجی تابع rand() اعداد تصادفی می باشد ولی با اجرای دوباره برنامه همان اعداد مجدداً به همان ترتيب قبلی تکرار می شوند. اين تکرار يکی از قابليتهای تابع می باشد ودر اشکال زدايی برنامه کاربرد دارد.

اگر بخواهيم که تابع rand() اعداد کاملاً تصادفی ايجاد کند بايد از تابع srand() استفاده کنيم. اين تابع ورودی از نوع اعداد صحيح بدون علامت می گيرد و باعث تصادفی شدن تابع rand() بر اساس مقدار ورودی تابع srand() می شود. تابعsrand() نيز در فايل کتابخانه ای stdlib.h قرار دارد. در برنامه زير به نحوه استفاده از تابع srand() پی خواهيد برد.

#include

#include

 

int main()

{

  unsigned int num;

 

  cout<<"Enter a number: ";

  cin>>num;

 

  srand(num);

 

  for (int i = 1; i<= 20; i++ )

   {

    cout << rand() % 6 + 1<<"\t";

 

    if ( i % 5 == 0 )

      cout << endl;

   }

  return 0;

}

خروجی برنامه به صورت زير می باشد.

Enter a number: 251

3       4       1       4       6

6       4       6       2       5

5       3       1       4       5

1       6       6       6       1

Enter a number: 350

1       4       3       4       1

2       6       2       6       2

4       2       5       3       5

4       4       5       2       3

Enter a number: 251

3       4       1       4       6

6       4       6       2       5

5       3       1       4       5

1       6       6       6       1

همانطور که می بينيد بر اساس ورودی های مختلف خروجی نيز تغيير می کند. توجه داشته باشيد که ورودی های يکسان خروجی های يکسانی دارند.

اگر بخواهيم بدون نياز به وارد کردن عددی توسط کاربر، اعداد تصادفی داشته باشيم می توانيم از تابع time که در فايل کتابخانه ای time.h قرار دارد استفاده کنيم . تابع time ساعت کامپيوتر را می خواند و زمان را بر حسب ثانيه بر می گرداند ، به اين ترتيب دستور زير:

srand(time(0));

باعث می شود که تابع rand() در هر بار اجرای برنامه اعداد متفاوتی را ايجاد کند. اگر برنامه فوق را به صورت زير باز نويسی کنيم با هر بار اجرای برنامه اعداد تصادفی متفاوتی خواهيم داشت.

#include

#include

#include

 

int main()

{

  srand(time(0));

 

  for (int i = 1; i<= 20; i++ )

   {

    cout << rand() % 6 + 1<<"\t";

   

    if ( i % 5 == 0 )

      cout << endl;

   }

  return 0;

}

مثال : برنامه ای بنويسيد که پرتاب سکه ای را شبيه سازی کند ، بدين صورت که سکه را 2000 بار پرتاب کند و دفعات رو يا پشت آمدن سکه را چاپ کند.

#include

#include

#include

 

int main()

{

  int back=0,front=0,face;

 

  srand(time(0));

 

  for (int i = 1; i<= 2000; i++ )

    {

      face=rand()%2+1;

      switch(face)

        {

          case 1:

            ++back;

            break;

          case 2:

            ++front;

            break;

          default:

            cout<<"Error!";

        }

    }

 

  cout<<"Front: "<< front<<?xml:namespace prefix = endl;

  cout<<"Back : "<< back<

 

  return 0;

}

 

 

 

;

;


مطالب مشابه :


مدل های تعادل عمومی پویای تصادفی - DSGE

اقتصادسنجی - مدل های تعادل عمومی پویای تصادفی - dsge - مدل های اقتصادسنجی




++C تولید اعداد تصادفی در

يک عدد تصادفی بين 1 تا 32767 را در متغير i قرار می دهد . تابع rand() اعداد را با احتمال مساوی در اين




ادامه تکنیک های خلاقیت

تکنیک واژه تصادفی. در این روش، ارتباطی اجباری بین موضوع مورد نظر و یک راژه که به طور تصادفی




گام تصادفی (Random walk)

حسابداری و تفکر ناب - گام تصادفی (Random walk) - وبلاگ شخصی سعید علی پور




پژو 206 مدل 81 دور رنگ بیمه برج 12 موتور( روغن سوزی دارد) قیمت 9 م

خرید و فروش خودروهای تصادفی - پژو 206 مدل 81 دور رنگ بیمه برج 12 موتور( روغن سوزی دارد) قیمت 9 م




برچسب :