تولید اعداد شبه تصادفی (C++)
در این پست دو روش برای ایجاد اعداد شبه تصادفی یکی به وسیله ی کد های مدیریت نشده و دیگری به وسیله ی کد های مدیریت شده را بررسی می کنیم. (شاید روش های دیگری برای این کار وجود داشته باشند ولی بنده تنها با این دو روش آشنا هستم.)
مدیریت نشده :
روش اول استفاده از تابع rand() برای تولید اعداد تصادفی است. این تابع در فایل cstdlib.h تعریف شده است، پس برای استفاده از آن باید این فایل را به برنامه اضافه کنید. (#include
برای مثال کد زیر سه عدد تصادفی را در سه متغیر a , b و c ذخیره می کند.
int a = rand();
int b = rand();
int c = rand();
تابع rand اعداد تصادفی را بر اساس یک عدد اولیه که هسته یا seed نامیده می شود ایجاد می کند و سپس هر عدد جدید را بر اساس عدد قبلی. مشکل اینجا است که چون این عدد ثابت است هر بار که این برنامه را اجرا کنید مقادیر یکسانی را برای سه متغیر a ، b و c دریافت خواهید کرد. برای حل این مشکل باید هسته ی اولیه را تغییر دهید، این کار با استفاده از تابع srand() انجام می شود. تابع srand مقدار هسته را به صورت یک پارامتر می پذیرد.
int a;
cin >> a;
srand(a);
در کد بالا ابتدا یک متغیر را تعریف کرده ایم و سپس آن را از ورودی دریافت می کنیم و سپس مقدار هسته را با استفاده از تابع srand برابر آن قرار می دهیم. اگر این کد را به ابتدای سه خط کد بالا اضافه کنیم و آن را اجرا کنیم سه عدد تصادفی متفاوت را در یافت خواهیم کرد. البته به شرطی که برای هسته اعداد مختلفی را وارد کنیم. میتوان از ساعت سیستم برای تنظیم هسته نیز استفاده کرد. تابع time() که در فایل ctime.h تعریف شده است، زمان فعلی سیستم را به صورت یک عدد صحیح unsigned بر می گرداند. خط زیر هسته را برابر زمان فعلی سیستم قرار می دهد.
srand(time(NULL));
چون زمان سیستم همیشه در حال تغییر است هر بار که برنامه را اجرا کنید تابع time عدد متفاوتی را برمی گرداند و در نتیجه اعداد تصادفی تولید شده متفاوت خواهند بود. نکته ی مهم اسن است که تابع srand تنها برای تنظیم هسته است و نمیتوان از آن به صورت مستقیم برای تولید اعداد تصادفی استفاده کرد.
مدیریت شده :
کلاس Random در محیط دات نت برای تولید اعداد شبه تصادفی ایجاد شده است. برای استفاده از این کلاس باید ابتدا یک نمونه از این کلاس ایجاد کنیم. خط زیر این کار را انجام می دهد.
Random^ Name = gcnew Random;
خط بالا با استفاده از عملگر gcnew یک نمونه جدید به نام Name از کلاس Random ایجاد می کند. کلاس Random دارای توابعی مانند تابع Next و NextDouble است که برای تولید اعداد تصادفی به کار می روند. با هر بار فراخوانی این توابع یک عدد تصادفی تولید می شود.
int a = Name->Next();
int b = Name->Next(100);
int b = Name->Next(100);
int c = Name->Next(100,200);
در کد بالا در هر خط از تابع Next استفاده شده است ولی هر کدام دارای پارامتر های متفاوتی هستند. فراخوانی تابع Next بدون پارامتر(مانند خط اول) باعث ایجاد عدد تصادفی در محدوده ی 0 تا ماکسیمم یک صحیح (2147483647) می شود. تابع Next با یک پارامتر (مانند خط دوم) باعث ایجاد عدد تصادفی کوچکتر از پارامتر ارسال شده می شود و در نهایت تابع Next با دو پارامتر (مانند خط سوم) باعث تولید عدد تصادفی در محدوده ی بین دو پارامتر ارسالی، می شود. میتوانید از تابع NextDouble() برای تولید اعداد اعشاری استفاده کنید ولی نباید پارامتری را به آن ارسال کنید.
+ نوشته شده در شنبه بیست و یکم دی ۱۳۹۲ ساعت 20:18 توسط کامران زرینی
|