مباحث تخصصی رشته ICT

در این وبلاگ مطالبی در زمینه ICT , برق و الکترونیک ارائه میشود.

مباحث تخصصی رشته ICT

در این وبلاگ مطالبی در زمینه ICT , برق و الکترونیک ارائه میشود.

تولید اعداد تصادفی در برنامه نویسی ++C

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

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

به عنوان مثال دستور زیر :

i = rand();

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

عموما بازه اعدادی که توسط تابع rand تولید می شود، با آنچه که مورد نیاز ماست متفاوت می باشد. به عنوان مثال برای شبیه سازی پرتاب سکه به دو عدد تصادفی و برای تاس به شش عدد تصادفی نیاز داریم. فرض کنید که می خواهید عدد 31250 را به عددی بین 1 تا 6 تبدیل کنید. چه راه کاری را در نظر می گیرید؟ راهی که برای این تبدیل وجود دارد استفاده از باقیمانده صحیح می باشد، همانطور که می دانید باقیمانده صحیح تقسیم هر عددی بر 6 یکی از اعداد 0 تا 5 می باشد. پس با اضافه کردن 1 واحد به باقیمانده ، عددی بین 1 تا 6 خواهیم داشت.عبارت 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;

}


نظرات 10 + ارسال نظر
دانشجویان ICT سوئیچ و سیار شیراز دوشنبه 7 اسفند‌ماه سال 1391 ساعت 07:00 ب.ظ http://ict-itmc.persianblog.ir/

درود بر شما همکار گرامی

با افتخار به وبلاگ ما لینک شدید. منتظر شما هستیم

با تشکر

با تشکر از بازدیدتون.
حتما از مطالبتون بهره میبریم

ahmadi moghadam سه‌شنبه 8 اسفند‌ماه سال 1391 ساعت 04:04 ب.ظ

سلام مهندس.
جالب بود . اگه حضوری و خلاصه توضیح بدی خیلی خوبه.
داغونتیم. تصادفیتیم

ممنونم عزیز.ما همیشه در خدمتیم.در هر لحظه از شبانه روز

[ بدون نام ] جمعه 11 اسفند‌ماه سال 1391 ساعت 08:35 ب.ظ

ممنون عالی بود

روجا چهارشنبه 12 تیر‌ماه سال 1392 ساعت 07:49 ب.ظ

عالیه برا پروژه کارشناسیم توپ کمکم کرد

خواهش میکنم .
خوشحالم کمکی کرد

محمد یکشنبه 16 تیر‌ماه سال 1392 ساعت 12:38 ب.ظ

سلام
با ذکر منبع کپی نمودم
با تشکر

ممنونم دوست عزیز.

مریم دوشنبه 17 تیر‌ماه سال 1392 ساعت 04:27 ب.ظ

مرسی
کارم راه افتاد شب امتحانی

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

کیوان دوشنبه 11 شهریور‌ماه سال 1392 ساعت 09:39 ب.ظ

سلام من به مشکلی بر خوردم برنامه ای میخوام که تعدادی اسم بگیره و هر بار که کلید فشرده میشه 3نفر رو انتخاب کنه و اینکه غیر تکراری باشه همچنین بشه از لیست اسمی رو حذف یا اضافه کرد ولی نمیدونم چجوری بنویسم اگه تو v.b باشه بهتره چون میخوام به exe تبدیل کنم که همه جا قابل استفاده باشه
ممنون

افشین چهارشنبه 20 فروردین‌ماه سال 1393 ساعت 02:10 ق.ظ

آقا دستت درد نکنه خیلی خوب بود. خیلی ممنون :)

hamana ali پنج‌شنبه 11 تیر‌ماه سال 1394 ساعت 12:15 ب.ظ

ممنون:)

فرید فتحی جمعه 13 شهریور‌ماه سال 1394 ساعت 01:23 ق.ظ

سلام وقت بخیر.
بابت توضیح بسیار ممنون.
من داده های تصادفی رو درست کردم و حالا می خوام داده هایی که در رنج خاص هستن رو حذف کنم.
برای مثال داده هام در دامنه ی 4000 تا 7000 هستن و من می خوام داده های 6200 به بالا حذف بشن. و یک خروجی بهم بده
همچین کاری ممکنه؟
و یا اینکه 10 درصد داده هامو به صورت تصادفی حذف کنه. ممنون میشم اگر خبرم کنید. خیلی نیازه.

ایمیل شما بعد از ثبت نمایش داده نخواهد شد