دستور randn در متلب – آموزش تولید اعداد تصادفی + کد و مثال

۱۷۸۲ بازدید
آخرین به‌روزرسانی: ۰۳ مرداد ۱۴۰۱
زمان مطالعه: ۶ دقیقه
دستور randn در متلب – آموزش تولید اعداد تصادفی + کد و مثال

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

دستور randn در متلب

اگر آرگومانی نداشته باشیم و دستور randn را به‌تنهایی بنویسیم، فقط یک مقدار تصادفی خواهیم داشت. برای مثال، اگر دستور زیر را در متلب بنویسیم:

1randn

جواب، عددی مانند عدد زیر خواهد بود:

ans =
0.5377

دقت کنید که با هر بار اجرای این دستور، عدد تصادفی جدیدی را به‌عنوان نتیجه خواهیم دید.

علاوه بر خود دستور randn به‌تنهایی، در تابع randn می‌توانیم یک یا چند مقدار را به‌عنوان آرگومان وارد کنیم. ورودی‌ها و آرگومان‌های تابع randn در متلب می‌تواند به‌گونه‌ای باشد که براساس نیاز کاربر تعریف شود. همچنین می‌توانیم به اندازه‌ و بُعد ورودی‌ای که می‌خواهیم به تابع بدهیم اشاره کنیم. این ورودی می‌تواند تک‌بعدی یا چندبعدی باشد. در کنار اندازه، می‌توان نوع توزیع مورد نظر را نیز تعیین کرد. در ادامه، این آرگومان‌ها را معرفی می‌کنیم.

تولید اعداد تصادفی با دستور randn در متلب

تابع randn در متلب را می‌توان به‌ شیوه‌های زیر نوشت و استفاده کرد:

1X = randn
2X = randn(n)
3X = randn(sz1,...,szN)
4X = randn(sz)
5
6X = randn(___,typename)
7X = randn(___,'like',p)
8
9X = randn(s,___)

در ادامه، کاربرد هریک را معرفی می‌کنیم.

  • X = randn یک مقدار اسکالر تصادفی را از توزیع نرمال استاندارد برمی‌گرداند.
  • X = randn(n) یک ماتریس n در n را با درایه‌هایی از اعداد تصادفی توزیع نرمال برمی‌گرداند.
  • X = randn(sz1,...,szN) یک آرایه sz1 در ... در ... در szN از اعداد تصادفی را برمی‌گرداند که sz1 و ... و szN، هریک، اندازه هر بعد آرایه را نشان می‌دهند. برای مثال، randn(3,4) یک ماتریس ۳ در ۴ را برمی‌گرداند.
  • X = randn(___,typename) یک آرایه از اعداد تصادفی را از نوع داده typename برمی‌گرداند. ورودی typename می‌تواند 'single' یا 'double' باشد. دقت کنید که می‌توان از هریک از آرگومان‌ها ورودی در سینتکس‌های قبل استفاده کرد.
  • X = randn(___,'like',p) یک آرایه از اعداد تصادفی مانند p را برمی‌گرداند؛ یعنی از همان نوع شیء p. می‌توان تعیین کرد که نوع داده typename یا 'like' باشد، اما هردو را با هم نمی‌توان نوشت.
  • X = randn(s,___) اعداد تصادفی‌ای را از جریان اعداد s تولید می‌کند، به‌جای آنکه از جریان جهانی آن‌ها را تولید کند. برای تولید یک جریان، می‌توان از دستور RandStream استفاده کرد. s را می‌توان با هریک از ترکیب‌های آرگومان در دستورات قبلی در نظر گرفت، جز آن‌هایی که شامل "like" هستند. این سینتکس از ورودی "like" پشتیبانی نمی‌کند.

توجه: ورودی‌های «seed» ،«state» و «twister» برای دستور randn توصیه نمی‌شوند. به جای آن از تابع rng استفاده کنید.

تفاوت دستور randn و rand چیست؟‌

دستور ()rand یک ماتریس با درایه‌های تصادفی تولید می‌کند که به‌طور یکنواخت در بازه (۰,۱) توزیع شده است، برمی‌گرداند. آرگومان‌ها همانند آرگومان‌های تابع ()eye در متلب هستند. تابع ()randn ماتریسی با عناصر شبه‌تصادفی توزیع نرمال با میانگین صفر و واریانس یک برمی‌گرداند. آرگومان‌های این تابع مانند آرگومانهای rand مدیریت می‌شوند.

مثال‌های دستور randn در متلب

در این بخش، مثال‌های متنوعی را از کاربرد تابع randn در متلب بیان می‌کنیم.

مثال اول دستور randn

ماتریسی ۵ در ۵ از اعداد تصادفی با توزیع نرمال تولید کنید.

جواب: از دستور زیر استفاده می‌کنیم:‌

1r = randn(5)

و ماتریس زیر ایجاد می‌شود:

r =

1.3546 -1.9609 1.3790 -0.2779 -1.5771
-1.0722 -0.1977 -1.0582 0.7015 0.5080
0.9610 -1.2078 -0.4686 -2.0518 0.2820
0.1240 2.9080 -0.2725 -0.3538 0.0335
1.4367 0.8252 1.0984 -0.8236 -1.3337

مثال دوم دستور randn

مقادیری از یک توزیع نرمال دو متغیره با بردار میانگین و ماتریس کوواریانس مشخص شده تولید کنید.

جواب: کد زیر را می‌نویسیم:

1mu = [1 2];
2sigma = [1 0.5; 0.5 2];
3R = chol(sigma);
4z = repmat(mu,10,1) + randn(10,2)*R

و جواب آن به‌صورت زیر خواهد بود:

z =

2.1275 1.8579
1.3502 -0.4741
0.7009 3.1260
1.0229 2.6994
0.7380 1.8425
-0.7502 1.0789
0.7143 0.8013
0.1686 2.9319
0.0208 1.3342
-0.1564 0.4766

مثال سوم تابع randn

یک عدد مختلط تصادفی منفرد با بخش‌های حقیقی و موهومی توزیع نرمال ایجاد کنید.

جواب: از دستور ساده زیر استفاده می‌کنیم:

1a = randn + 1i*randn

و به جواب زیر می‌رسیم.

a =

1.3514 - 0.2248i

مثال چهارم تابع randn

یک آرایه ۳ در ۲ در ۳ از اعداد تصادفی بسازید.

جواب: بدین منظور، کد زیر را می‌نویسیم:

1X = randn([3,2,3])

که جواب آن به‌صورت زیر است:

X(:,:,1) =
1.6555 -0.8655
0.3075 -0.1765
-1.2571 0.7914

X(:,:,2) =
-1.3320 0.3335
-2.3299 0.3914
-1.4491 0.4517

X(:,:,3) =
-0.1303 0.8620
0.1837 -1.3617
-0.4762 0.4550

مثال پنجم تابع randn

یک بردار ۱ در ۴ از اعداد تصادفی بسازید که درایه‌های آن single باشند.

جواب: از دستور زیر استفاده می‌کنیم:

1r = randn(1,4,'single')

که جواب آن به‌صورت زیر است:

r =
1×4 single row vector
-0.8487 -0.3349 0.5528 1.0391

اگر دستور زیر را بنویسیم:

1class(r)

جواب زیر را خواهیم داشت:

ans =
'single'

مثال ششم تابع randn

ماتریسی از اعداد تصادفی توزیع نرمال با اندازه یک آرایه موجود ایجاد کنید.

جواب: کد زیر را می‌نویسیم:

1A = [3 2; -2 1];
2sz = size(A);
3X = randn(sz)

که نتیجه حاصل از اجرای آن به‌صورت زیر است:

X =
-1.1176 0.6601
1.2607 -0.0679

ترکیب دو خط قبلی کد در یک خط یک الگوی رایج است و می‌توان آن را به‌صورت زیر نوشت:

1X = randn(size(A));

مثال هفتم تابع randn

یک ماتریس ۲ در ۲ با دقت single از اعداد تصادفی ایجاد کنید.

جواب: از دستور زیر استفاده می‌کنیم:

1p = single([3 2; -2 1]);

آرایه‌ای از اعداد تصادفی با اندازه و نوع داده p ایجاد می‌کنیم.

1X = randn(size(p),'like',p)

که نتیجه اجرای آن به‌صورت زیر است:

X =

2×2 single matrix

-0.1952 -0.3031
-0.2176 0.0230

اگر بخواهیم کلاس این جواب را مشخص کنیم، از دستور زیر استفاده می‌کنیم‌:

1class(X)

که نتیجه زیر را نشان می‌دهد:

ans =

'single'

مثال هشتم تابع randn

یک مثال ساده را بررسی می‌کنیم. در این مثال، Value1 یک متغیر ورودی است که مقادیر تصادفی را ذخیره می‌کند. در این کد، تابع randn هیچ آرگومانی ندارد تا فقط یک مقدار نشان‌داده‌ شده در مثال را چاپ کند.

1clc ;
2clear all ;
3disp('Output');
4Value1 = randn

نتیجه این کد به‌صورت زیر است:

Output
Value1 =
1.8339

اگر تابع randn را به‌طور مکرر در یک کد بنویسیم، مقادیر تصادفی متفاوتی را چاپ می‌کند. مثلاً، اگر یک تابع را سه بار بنویسیم، سه مقدار تصادفی را به‌عنوان خروجی داریم. برای نمونه، کد زیر را نیز می‌نویسیم:

1clc ;
2clear all ;
3disp ('Output');
4Value1 = randn
5Value2 = randn
6Value3 = randn

با اجرای این کد، خروجی زیر را خواهیم داشت:

Output

Value1 =
1.0347

Value2 =
0.7269

Value3 =
-0.3034

مثال نهم تابع randn

در این مثال، ابعاد را به‌عنوان آرگومان در تابع randn خواهیم دید. برای مثال، می‌توانیم ببینیم که یک مقدار خروجی برای یک تابع داریم. اگر فقط یک مقدار در داخل پرانتزها وجود داشته باشد، آنگاه تعدادی از سطرها و همچنین تعدادی از ستون‌های ماتریس خروجی را نشان می‌دهد. بنابراین، ابعاد خروجی دو در دو و چهار در چهار است. به‌عنوان مثال، دو مقدار در داخل پرانتزها نوشته شده است. مقدار اول تعداد سطر و مقدار دوم تعداد ستون را نشان می‌دهد.

1clc ;
2clear all ;
3disp('Output');
4Value1 = randn(2)
5Value2 = randn(4)

خروجی کد بالا به‌‌صورت زیر است:

Output

Value1 =
0.2939 0.8884
-0.7873 -1.1471

Value2 =
-1.0689 0.3252 -0.1022 -0.8649
-0.8095 -0.7549 -0.2414 -0.0301
-2.9443 1.3703 0.3192 -0.1649
1.4384 -1.7115 0.3129 0.6277

اکنون کد زیر را آزمایش می‌کنیم.

1clc ;
2clear all ;
3disp('Output');
4Value1 = randn (1,3)
5Value2 = randn (4,2)

که نتیجه اجرای آن به‌صورت زیر است:‌

Output

Value1 =
1.0933 1.1093 -0.8637

Value2 =
0.0774 1.5326
-1.2141 -0.7697
-1.1135 0.3714
-0.0068 -0.2256

همچنین، وقتی سه مقدار در داخل پرانتزهای تابع وجود داشته باشد، مقدار اول تعداد سطر، مقدار دوم تعداد ستون و مقدار سوم تعداد ماتریس‌‌ها را مشخص می‌کند. بدین منظور، کد زیر را می‌نویسیم.

1clc ;
2clear all ;
3disp ('Output');
4Value1 = randn (1, 3, 2)
5Value2 = randn(3, 1, 2)

و نتیجه اجرای آن به‌صورت زیر خواهد بود:

Output

Value1(:,:,1) =
1.1174 -1.0891 0.0326

Value1(:,:,2) =
0.5525 1.1006 1.5442

Value2(:,:,1) =
0.0859
-1.4916
-0.7423

Value2(:,:,2) =
-1.0616
2.3505
-0.6156

مثال دهم تابع randn

در این مثال، نوع داده‌ای را که می‌خواهیم ایجاد کنیم، بررسی می‌کنیم. در کنار ابعاد، می‌توانیم نوع ورودی مورد نظرمان را در خروجی مانند single یا double یا distributed نیز ذکر کنیم که در این مثال آن را بررسی می‌کنیم. اگر عملیات ماتریسی انجام دهیم، همه ماتریس‌ها باید یک اندازه باشند. بنابراین، برای حفظ اندازه یک ماتریس، می توانیم از سینتکس یا همان نحو "size" در تابع randn استفاده کنیم که در مثال نشان داده شده است.

1clc ;
2clear all ;
3disp('Output');
4Value1 = randn(2, 'single')
5Value2 = randn (3, 'distributed')

با اجرای این کد، به نتیجه زیر می‌رسیم.

Output

Value1 =
2×2 single matrix
-0.1961 0.2916
1.4193 0.1978

Value2 =
1.7548 -2.3358 -0.1436
-0.8130 -0.1428 -0.2606
-2.0423 0.3107 0.8402

به‌عنوان یک مثال دیگر، کد زیر را می‌نویسیم:

1clc ;
2clear all ;
3disp('Output');
4Value1 = randn( 2,'single')
5Value2 = randn (2 ,'double')

که جواب آن به‌شکل زیر است.

Output

Value1 =
2×2 single matrix
1.5877 0.6966
-0.8045 0.8351

Value2 =
-0.2437 -1.1658
0.2157 -1.1480

اکنون، یک کد دیگر را بررسی می‌کنیم.

1clc ;
2clear all ;
3disp('Output');
4Input = [ 4,3; 2,2; 4,7] 
5Dim = size (Input)
6Value1= randn (Dim)

و در نهایت، خروجی زیر را خواهیم داشت:

Output

Input =
4 3
2 2
4 7

Dim =
3 2

Value1 =
0.1049 -0.6669
0.7223 0.1873
2.5855 -0.0825

مثال یازدهم تابع randn

در مثال قبلی، داده‌های ورودی اعداد حقیقی بودند. با استفاده از تابع randn در متلب می‌توان اعداد مخلتلط تصادفی نیز تولید کرد. در این مثال، برای ایجاد یک عدد مختلط، عدد حقیقی را در ‘i’ ضرب می‌کنیم. کد زیر نحوه تولید اعداد مختلط تصادفی با استفاده از تابع randn در متلب را نشان می‌دهد.

1clc ;
2clear all ;
3disp('Output');
4Value1 = 2+ i * randn
5Value2 = randn + i * randn

که جواب آن به‌صورت زیر است:

Output

Value1 =
2.0000 - 1.9330i

Value2 =
-0.4390 - 1.7947i

جمع‌بندی

در این آموزش از مجله فرادرس، با تابع randn در متلب آشنا شدیم و مثال‌هایی عملی از کاربرد آن در تولید اعداد تصادفی را بیان کردیم.

بر اساس رای ۱۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
مجله فرادرس
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *