تولید اعداد تصادفی در متلب
به نام خدا و سلام.
به جلسه سی و پنجم از سری جلسات آموزش متلب خوش آمدید. آموزش متلب از وبسایت متلبپلاس به صورت رایگان ارائه میشود. در این جلسه به آموزش اعداد تصادفی در متلب میپردازیم. نحوهی ایجاد عدد تصادفی در متلب، ماتریس تصادفی و انواع اعداد تصادفی از مباحث این جلسه است. دستورات مهمی که در این جلسه با آنها سروکار داریم دستور rand، دستور randn، دستور randi و دستور randperm است. البته دستورات دیگری نیز معرفی و استفاده میشوند که اهمیت کمتری دارند.
با متلب پلاس همراه باشید.
مقدمهای بر اعداد تصادفی در متلب
اعداد تصادفی بخش مهمی از احتمال و ریاضیات آماری را تشکیل میدهند. یک عدد تصادفی معمولا در یک بازه مشخص (مثلا صفر تا یک) تعریف میشود. در ریاضیات، تکرار هر عدد تصادفی عملا غیرممکن است. چرا که تکرار شدن یک عدد در بین بینهایت عدد، غیرممکن است. به بیانی دقیقتر، احتمال رخداد اعداد تصادفی، کاملا تصادفی و مستقل است. هیچگونه وابستگی بین اعداد تصادفی تولید شده وجود ندارد. در نرم افزار متلب (بعنوان یک نرم افزار علمی و کاربردی) نیز همینطور است. در واقع اگر در متلب، بارها و بارها دستور تولید عدد تصادفی را تکرار کنید، هربار یک عدد جدید خواهید دید.
اعداد تصادفی را میتوان به دو دسته مهم تقسیم کرد. اعداد تصادفی پیوسته و اعداد تصادفی گسسته. متغیر تصادفی پیوسته یک متغیر تصادفی است که میتواند مجموعهای از مقادیر را به خود بگیرد. از متغیرهای تصادفی پیوسته برای نشان دادن اندازه گیریهایی مانند قد، وزن، زمان و غیره استفاده میشود. یک متغیر تصادفی گسسته متغیری است که ممکن است فقط تعداد قابل شمارشی از مقادیر متمایز مانند 1،2،3،4 و… را شامل میشود.
اعداد تصادفی پیوسته، شامل همهی اعداد و اعداد تصادفی گسسته شامل اعداد صحیح میباشند. در ادامهی آموزش نرم افزار متلب با نحوهی ایجاد عدد و ماتریس تصادفی در متلب آشنا میشویم.
تولید اعداد تصادفی پیوسته در متلب
برای ایجاد عدد یا ماتریس تصادفی پیوسته در متلب دستور rand و randn وجود دارد. در ادامه هر یک از این دستورات توضیح داده میشود.
ایجاد اعداد تصادفی با دستور rand در متلب
دستور rand در متلب اعداد تصادفی با توزیع یکنواخت ایجاد میکند. منظور از توزیع یکنواخت این است که شانس رخ دادن هر عدد در این حالت با بقیه برابر است. دستور rand(n) یک ماتریس مربعی n در n از اعداد تصادفی ایجاد میکند. بازه اعداد تصادفی در دستور rand بین صفر تا یک است. به مثال زیر دقت کنید.
rand(4)
ans =
0.8147 0.6324 0.9575 0.9572
0.9058 0.0975 0.9649 0.4854
0.1270 0.2785 0.1576 0.8003
0.9134 0.5469 0.9706 0.1419
همانطور که میبینید، یک ماتریس 4 در 4 با اعداد تصادفی بین صفر تا یک برای ما ایجاد شدهاست. اگر بخواهیم برداری از اعداد تصادفی با دستور rand بسازیم، به صورت rand(1,n) یا rand(n,1) عمل میکنیم.
rand(1,5)
ans =
0.4218 0.9157 0.7922 0.9595 0.6557
دستور rand در متلب، اعداد تصادفی را در بازه صفر تا یک تولید میکند.
تولید عدد تصادفی در بازه دلخواه در متلب
همانطور که دیدیم، دستور rand، اعداد تصادفی را در بازه صفر تا یک تولید میکند. اگر بخواهیم این اعداد در بازهی دلخواه a تا b باشند، از فرمول زیر استفاده میکنیم.
مثلا 5 عدد تصادفی ایجاد میکنیم که در بازه 2 تا 4 باشند. به کد زیر دقت کنید.
a = 2;
b = 4;
r = a + (b - a)*rand(1,5)
r =
2.1517 2.1079 3.0616 3.5583 3.8680
ایجاد اعداد تصادفی مختلط در متلب
برای تولید اعداد مختلط تصادفی در متلب کافیست از فرم اصلی اعداد مختلط استفاده کنیم. یعنی یک عدد تصادفی ساده را با یک عدد تصادفی که در i ضرب شده، جمع کنیم.
a = rand + 1i*rand
a =
0.4497 + 0.6422i
به همین ترتیب میتوان یک بردار یا ماتریس از اعداد مختلط تصادفی در متلب ایجاد کرد. در مثال زیر یک ماتریس 5 در 2 از اعداد مختلط ایجاد میکنیم.
A = rand(5,2) + 1i*rand(5,2)
A =
0.3695 + 0.1281i 0.1190 + 0.0924i
0.0601 + 0.7980i 0.0276 + 0.8876i
0.5954 + 0.7991i 0.8755 + 0.5840i
0.9402 + 0.7842i 0.7893 + 0.7433i
0.7828 + 0.6638i 0.6639 + 0.1842i
ایجاد اعداد تصادفی با دستور unifrnd در متلب
دستور unifrnd (مخفف Uniform Random Number) برای ایجاد عدد تصادفی در بازه دلخواه بکار میرود. دستور unifrnd(a,b,[m,n]) یک ماتریس تصادفی m در n از اعداد تصادفی در بازه a تا b میدهد. استفاده از این دستور نسبت به استفاده از فرمولی که در بالا ذکر شد راحتتر است. اما این دستور در تولباکس آمار و ماشین لرنینگ (Statistics and Machine Learning Toolbox) متلب میباشد. اگر هنگام نصب متلب، این تولباکسها را نصب نکرده باشید، نمیتوانید از آن استفاده کنید. دستورات rand و سایر دستوراتی که در ادامه معرفی میکنیم در خود متلب تعریف شدهاند.
برای ایجاد یک ماتریس تصادفی 2 در 5 در بازه صفر تا 10 به صورت زیر عمل میکنیم.
unifrnd(0,10,[2,5])
ans =
1.2991 4.6939 3.3712 7.9428 5.2853
5.6882 0.1190 1.6218 3.1122 1.6565
اعداد تصادفی تولید شده با دستور unifrnd نیز به صورت یکنواخت میباشند. یعنی شانس هر رخداد با سایرین برابر است. در ادامه اعداد تصادفی را با توزیع نرمال (گاوسی) تولید میکنیم. سپس تفاوت این دو توزیع را با رسم نمودار توضیح خواهیم داد.
ایجاد اعداد تصادفی با دستور randn در متلب
دستور randn در متلب اعداد تصادفی با توزیع نرمال ایجاد میکند. حرف n انتهای این دستور به معنای توزیع نرمال normal یا گاوسی (گوسی) میباشد. توزیع نرمال (گاوسی) به صورتی است که شانس رخداد در نزدیکی میانگین بیشتر از سایر نقاط است. بطور پیشفرض، اعداد تصادفی که با دستور randn ایجاد میشوند دارای میانگین صفر و انحراف معیار یک میباشند. در مثال زیر یک مجموعه 100 تایی از اعداد تصادفی با توزیع گاوسی تولید میکنیم.
A = randn(100,1);
برای اینکه درستی توزیع اعداد فوق را بررسی کنیم، میانگین و انحراف معیار آن را محاسبه میکنیم. در نرم افزار متلب، میانگین با دستور mean و انحراف معیار با دستور std محاسبه میشود. در جلسه محاسبات آماری در متلب، تمامی این دستورات شرح داده شدهاست. (برای مشاهده، روی عبارت قرمز رنگ کلیک کنید.)
mean(A)
ans =
0.1037
std(A)
ans =
0.9356
خب همانطور که مشاهده میکنید میانگین برابر با 0.10 و انحراف معیار برابر با 0.93 میباشد. از طرفی، این مجموعه شامل 100 عدد با توزیع گاوسی است. هرچه تعداد نمونهها بیشتر باشد، میانگین و انحراف معیار به مقدار دقیق خود (یعنی صفر و یک) نزدیکتر میشوند. برای درک بهتر، ابتدا یک مجموعهی 1000 تایی از اعداد تصادفی با توزیع گاوسی را تولید میکنیم. سپس میانگین و انحراف معیار آن را محاسبه میکنیم.
B = randn(1000,1);
mean(B)
ans =
0.0180
std(B)
ans =
1.0123
دیدیم که میانگین اعداد تصادفی با توزیع نرمال برابر صفر و انحراف معیار آنها برابر با یک است. اما ممکن است سوال پیش بیاید که چطور اعداد تصادفی با میانگین و انحراف معیار دلخواه تولید کنیم. در ادامه به این سوال پاسخ میدهیم.
اعداد تصادفی با میانگین و انحراف معیار دلخواه
برای تولید اعداد تصادفی با توزیع نرمال که میانگین و انحراف معیار دلخواه داشته باشد، از فرمول زیر استفاده میکنیم.
مثلا یک مجموعه 1000 تایی از اعداد تصادفی با میانگین 2 و انحراف معیار 3 ایجاد میکنیم.
mu = 2;
sigma = 3;
y = mu + sigma*randn(1000,1);
حال با محاسبه میانگین و انحراف معیار، درستی آن را بررسی میکنیم.
mean(y)
ans =
2.0031
std(y)
ans =
3.0652
رسم هیستوگرام اعداد تصادفی (مقایسه توزیع یکنواخت و گاوسی)
حال که مبحث تولید اعداد تصادفی پیوسته کامل شد، به مقایسه توزیع نرمال و یکنواخت میپردازیم. بهترین راه برای درک اختلاف بین توزیع گاوسی (نرمال) با توزیع یکنواخت رسم هیستوگرام است. یک مجموعهی 10000 تایی از اعداد تصادفی با توزیع یکنواخت و گاوسی درنظر میگیریم.
A = rand(10000,1);
B = randn(10000,1);
histogram(A,50)
title('Uniform Distribution^{MatlabPlus.com}')
figure
histogram(B,50)
title('Gaussian (Normal) Distribution^{MatlabPlus.com}')
در هیستوگرامهای بالا تفاوت دو توزیع واضح است. در توزیع یکنواخت (سمت چپ) شانس رخ دادن هر یک از اعداد صفر تا یک برابر است. چرا که ستونها دارای طول یکسان میباشند. در واقع طول هر ستون، احتمال رخ دادن آن مقدار را نشان میدهد. اما در توزیع گاوسی (نرمال) شانس رخ دادن اعداد نزدیک به میانگین (صفر) بسیار بیشتر از سایر نقاط است. هر چه از میانگین دور میشویم شانس رخ دادن کمتر میشود. کشیدگی نمودار (از میانگین به طرفین) با انحراف معیار تعیین میشود.
در ادامه، به اعداد تصادفی گسسته میپردازیم.
تولید اعداد تصادفی گسسته در متلب
در بخش قبل جزئیات کامل درباره اعداد تصادفی پیوسته در متلب ارائه شد. دسته بندی دیگری که برای اعداد تصادفی داشتیم، اعداد تصادفی گسسته بود. در این بخش به آموزش تولید اعداد تصادفی گسسته که شامل اعداد صحیح اند میپردازیم.
ایجاد اعداد تصادفی با دستور randi در متلب
دستور randi در متلب، اعداد تصادفی صحیح (گسسته) ایجاد میکند. دستور randi(imax,n) یک ماتریس مربعی n در n از اعداد تصادفی صحیح در بازه یک تا imax تولید میکند. دستور randi([imin,imax],m,n) یک ماتریس m در n تصادفی صحیح بین imin تا imax ایجاد میکند. مثلا یک ماتریس 4 در 5 از اعداد صحیح تصادفی 1 تا 100 ایجاد میکنیم.
randi(100,4,5)
ans =
5 30 46 58 31
86 76 12 87 25
28 1 78 30 20
57 20 44 61 95
در مثال بعد، 5 عدد تصادفی صحیح بین 10 تا 20 تولید میکنیم.
randi([10 20],1,5)
ans =
13 20 14 13 20
اگر به اعداد تصادفی فوق دقت کنید، میبینیم که عدد 20 تکرار شدهاست. در تولید اعداد تصادفی گسسته (صحیح) با دستور randi، تکرار اتفاق میافتد. در واقع شرط تصادفی بودن اعداد با اعمال جایگذاری است. در ادامه، حالت بدون تکرار (بدون جایگذاری) که در آمار با جایگشت میشناسیم ارائه میشود.
ایجاد اعداد تصادفی با دستور randperm در متلب (جایگشت)
برای تولید اعداد تصادفی صحیح بدون تکرار (بدون جایگذاری) در متلب از دستور randperm استفاده میکنیم. دستور randperm (مخفف Random permutation) کاربرد فراوانی در آمار و احتمالات دارد. دستور randperm(n) یک بردار سطری n تایی از جایگشت اعداد یک تا n را میدهد. دستور randperm(n,k) نیز جایگشتی از k در n عدد به ما میدهد. به عبارت دیگر، این دستور k عدد تصادفی بدون تکرار در بازه یک تا n میدهد.
برای مثال اول، جایگشتی از اعداد 1 تا 5 را با دستور randperm ایجاد میکنیم.
randperm(5)
ans =
5 3 4 1 2
معنای این اعداد این است چگونه 5 نفر را با انتخاب شانسی مرتب کنیم.
در مثال بعد، جایگشت یک از 6 را محاسبه میکنیم.
randperm(6,1)
ans =
4
این کار مشابه با انداختن تاس است. هربار که دستور بالا را اجرا کنیم یک عدد بین 1 تا 6 به ما میدهد.
تنها نقطه ضعف دستور randperm در این است که بازهی مجموعه همواره از یک تا n تعیین میشود. در واقع ما اختیاری برای شروع مجموعه نداریم. برای حل این مشکل دستوری مشابه با randperm اما با توانایی بالاتر معرفی میکنیم.
ایجاد اعداد تصادفی با دستور randsample در متلب
دستور randsample مشابه با دستور randperm است اما بازهی اعداد را میتوان در آن وارد کرد. با استفاده از دستور randsample میتوان یک (یا چند) نمونه را از یک مجموعه به صورت تصادفی انتخاب کرد. نحوهی عملکرد این دستور هم مشابه با randperm به صورت بدون تکرار (بدون جایگذاری) است. دستور randsample(n,k) تعداد k عضو از یک تا n انتخاب میکند. دستور randsample(a:b,k) نیز k عضو در بازهی a تا b انتخاب میکند.
مثلا فرض کنید میخواهیم از بین 100 تا 200 تعداد 5 عضو را انتخاب کنیم. در این حالت مطابق زیر عمل میکنیم.
randsample(100:200,5)
ans =
197 143 152 140 172
حال میخواهیم از بین اعداد 1 تا 300، به صورت تصادفی 5 عدد انتخاب کنیم که تکراری نباشد. اعداد انتخابی در بازهی 1 تا 100 باید 2 عدد و در بازهی 101 تا 300 نیز 3 عدد باشند. برای حل به صورت زیر عمل میکنیم.
a = randsample(100,2);
b = randsample(101:300,3);
c = [a;b']
c =
36
9
208
107
236
مشاهده میکنیم که شرایط سوال بدرستی انجام شدهاند.
تمرینات این جلسه
در انتهای این جلسه 3 تمرین متلب مربوط به مباحث این جلسه ارائه شده است. لطفا این تمرینها را حل کرده و با پاسخ آن مقایسه کنید. پاسخ تمرینات متلب این جلسه در کانال تلگرام متلب پلاس منتشر میشود. از آیکونهای سمت راست صفحه میتوانید در این کانال عضو شوید.
تمرین اول) یک مجموعهی تصادفی پیوسته یکنواخت شامل 10 عضو در بازهی یک تا 2 ایجاد کنید. (از دستور unifrnd استفاده نکنید!)
تمرین دوم) یک مجموعهی تصادفی با توزیع گاوسی که شامل 1000 عضو باشد ایجاد کنید. میانگین این مجموعه را 5 و انحراف معیار را 2 درنظر بگیرید. درستی میانگین و انحراف معیار را بررسی کنید.
تمرین سوم) با استفاده از جایگشت، از یک نمونهی 500 تایی 5 عضو انتخاب کنید. 2 عضو در بازه 1 تا 400 و 3 عضو دیگر در بازه 401 تا 500 باشند.
جمعبندی
جلسه سی و پنجم از سری جلسات آموزش متلب به پایان رسید. این جلسه درباره اعداد تصادفی صحبت کردیم. اعداد تصادفی به دو دسته پیوسته و گسسته تقسیم میشوند. دستورات هر یک از این دستهها را به طور کامل در متلب معرفی کردیم. مواردی شامل: ایجاد عدد تصادفی، ماتریس تصادفی، توزیع یکنواخت و گاوسی اعداد تصادفی، اعداد تصادفی مختلط، عدد تصادفی صحیح. همچنین مباحثی پیرامون جایگشت (عدد تصادفی بدون تکرار) و رسم هیستوگرام اعداد تصادفی در متلب نیز ارائه شد. در انتها چند تمرین برای یادگیری بیشتر به شما واگذار کردیم که پاسخ آنها در کانال تلگرامی متلب پلاس وجود دارد. بی صبرانه منتظر نظرات، سوال و ابهامات شما عزیزان هستیم. سعی میکنیم تا هرگونه سوال یا ابهامی که در این باره دارید را پاسخ دهیم.
توصیه میشود که حتما تمرینات این جلسه را انجام بدید و اگر سوال و ابهامی دارید در بخش نظرات (پایین همین صفحه) به ما بگید. از فهرست سمت راست هم میتونید به بقیه جلسات دسترسی داشته باشید.
15 Comments
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
سلام
اگه بخوایم به طور تصادفی 4 عدد در بازه 1 تا 6 در متلب ایجاد کنیم از چه دستوری باید استفاده کنیم؟
سلام مهدیار عزیز
برای ایجاد اعداد تصادفی صحیح از دستور randi در متب استفاده میشه. حالا چون 4 تا عدد لازم داریم، ازین دستور به صورت randi(6,[1,4]) استفاده میکنیم. خروجی این دستور 4 عدد تصادفی در بازه 1 تا 6 خواهد بود
اما اگر بخواهیم از 1 تا 6 بطور تصادفی 4 تا عدد انتخاب کنیم که تکراری نباشند (در واقع جایگشت) از دستور randperm استفاده میشه. دستور randperm(6,4) در خروجی 4 تا عدد میده که بین 1 تا 6 هستند و تکرار هم در اون دیده نمیشه.
سوال یا ابهام دیگهای بود در خدمتیم.
موفق باشید.
سلام
اگر بخوایم تابع جرم احتمال رو واسه یه سری داده ورودی محاسبه کنیم چکار باید کرد؟
و برای اینکه یه تعداد داده تصادفی جدید با همان توزیع احتمال داده های ورودی ایجاد کنیم هم باید چه کرد؟
باتشکر
سلام میلاد جان
برای محاسبه تابع چگالی احتمال در متلب از دستور pdf و cdf استفاده میشه. از طرفی توابع مختلفی برای بررسی چگالی احتمال وجود داره مثل توزیع نرمال یا گاوسی، بتا و… که همه اینها در متلب قرار دارند. در دستور pdf نوع توزیع، داده و مشخصات رو وارد میکنیم و متلب چگالی احتمال رو محاسبه میکنه.
برای ایجاد داده تصادفی با توزیع مشخص هم میشه از دستور makedist استفاده کرد. این دستور هم میتونه نوع توزیع آماری رو بگیره و اعداد تصادفی ایجاد کنه.
ممنون از سایت خوبتون 🙏
سلام اگر بخواهیم مثلا دویست عدد با توزیع نرمال و میانگین مثلا ۴۰ وانحراف معیار یازده بین دو عدد ۱۸تا۱۰۰ داشته باشیم از چه دستوری استفاده کنیم
باتشکر
سلام و عرض ادب
در متن بالا یک مثال از موردی که فرمودید ارائه شده. کافیه مقدار میانگین و انحراف معیار رو تغییر بدید و همون کد رو اجرا کنید.
سلام
اگر بخوایم تو یه صفحه 800 در 800 برای ایجاد 10 نقطه تصادفی با مختصات تصادفی که هر بار این 10 نقطه و مختصات جدید باشن ایجاد کنیم ممنون میشم راهنمایی کنید
با سلام و عرض ادب
مرحله اول) ابتدا باید یک ماتریس صفر 800 در 800 با استفاده از دستور zeros ایجاد کنید.
مرحله دوم) دو عدد تصادفی که در بازه 1 تا 800 باشند ایجاد کنید که این دو عدد تصادفی، مختصات i و j ما هستند.
مرحله سوم) با استفاده از اندیس گذاری در متلب، به این مختصات تصادفی A(i,j) یک عدد تصادفی اختصاص بدید.
مرحله چهارم) کل این فرآیند رو درون یک حلقه تکرار for در متلب پیاده سازی کنید.
کد متلب این برنامه مشابه زیر میشه:
A = zeros(800);
for k = 1:10
i = randi(size(A,1));
j = randi(size(A,1));
A(i,j) = randi(1000);
k = k + 1;
end
عدد تصادفی که ایجاد میشه در بازه 1 تا 1000 درنظر گرفته شده. میتونید تغییرش بدید.
سلام
وقت بخیر
ممنون از آموزش کاملتون
من می خوام 10 عدد صحیح تصادفی بین 1 تا 100 ایجاد کنم اما می خوام مثلا یک عدد خاص مثلا 15 در این اعداد تصادفی ایجاد شده، نباشه. باید از چه دستوری استفاده کنم؟
سلام و عرض ادب
خوشحالیم که این آموزش مورد رضایت شما بوده.
بطور کلی در تولید اعداد تصادفی، توزیع نرمال یا یکنواخت و… اهمیت داره. بعبارت دیگه اعداد واقعا تصادفی اند و نمیدونیم که چه عددی تولید میشه. به همین دلیل شاید خیلی منطقی نباشه که در یک بازه، بخواهیم یک عدد رو استثنا کنیم. اما برای اینکار راههای مختلفی وجود داره. مثلا میتونید یکبار از 1 تا 14 و یکبار از 16 تا 100 اعداد تصادفی صحیح رو تولید کنید.
موفق باشید.
احتمالا با کمک گرفتن از براکت و عملگر های مختلف میشه تابع randn با خروجی اعداد صحیح با توزیع نرمال تولید کرد ولی خواستم بپرسم که ما به صورت مستقیم برای این قضیه راه حل نداریم ! درسته ؟
بله روش همونی هست که خودتون فرمودید.
با سلام
من میخوام بین دو عدد، اعداد تصادفی با گام مثلا 0.1 انتخاب کنه، یعنی بین دو عدد 1 و 5، گزینه های انتخابی 1.1و1.2و1.3و 1.4 تا 4.9 و 5 باشه
دستور چگون خواهد بود؟
سلام وحید جان
اگر به متن این جلسه خوب دقت کنی نحوه تولید عدد تصادفی در بازه دلخواه در متلب آموزش داده شده. برای مثال اگر بخواهیم در بازه a تا b به تعداد n عدد تصادفی ایجاد کنیم بصورت زیر عمل میکنیم:
a+(b-a)*rand(n)
موفق باشید.