تولید اعداد تصادفی

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

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

i = rand();

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

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

   حال اگر به جای متغير 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 <iostream.h>
#include <stdlib.h>
 
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 <iostream.h>
#include <stdlib.h>
 
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 <iostream.h>
#include <stdlib.h>
#include <time.h>
 
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 <iostream.h>
#include <stdlib.h>
#include <time.h>
 
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<<endl;
  cout<<"Back : "<< back<<endl;
 
  return 0;
}


 

 

 

   معرفی کامپيوتروبرنامه نويسی

   ساختارهای کنترلی

   توابع

   آرايه ها

   اشاره گر ها و رشته ها

   کلاسها

   گرانبار کردن عملگر ها

 
 
 
   
 
 
 

حق کپی رایت محفوظ می باشد