۱۳۸۸/۱۰/۰۱

شبیه سازی

@ پروژه استاد اکبری:
متاسفانه نتونستم جواب درستی برای خطای stack overflow تو سی شارپ اونم برای randomize پیدا کنم ولی تا هفته آینده پروژه استاد اکبری به زبان سی شارپ (in .net 2008) برام نوشته می شه (; :) و متن اونو کامنت نویسی شده تو بلاگم می ذارم تا بشه از کدهاش استفاده کرد.

+ خوندن این مرجع سی شارپ رو هم که کدهاش تو سایت wrox.com هست توصیه می کنم:
http://rapidshare.com/files/149123074/Wrox_Beginning_Microsoft_Visual_C_Sharp_2008_May_2008-BBL.rar

+++

تولید اعداد راندوم در .Net با استفاده از زبان C#

کلاس Random که از کلاس های پایه دات نت (System.Random) است، وظیفه پیاده سازی و تولید اعداد تصادفی ساده (رمز نگاری(cryptography) نشده) را بر عهده دارد.

هیچ کدام از متد های این کلاس به صورت static پیاده سازی نشده اند، به همین جهت باید قبل استفاده ، یک شئ از این کلاس ایجاد کنیم :

Random Rand = new Random();

در این مثال، Rand یک نمونه از کلاس Random است، که از این طریق میتوان به متد های پایه کلاس Random دسترسی پیدا کرد :

در زمان پیاده سازی این کلاس متوجه میشویم که مایکروسافت از 2 constructor برای نوشتن این کلاس استفاده کرده :

1-حالت پایه که بدون پارامتر از کلاس نمونه سازی خواهیم داشت :

مانند مثال قبل :

Random Rand = new Random();

2- حالت دوم که در زمان نمونه سازی باید یک عدد Int32 را به عنوان پارامتر ورودی بدهیم :

مانند :

Random Rand = new Random(100);

حال باید دید فرق حالت 1 و خالت 2 در چیست؟

مایکروسافت در الگوریتم ریاضی که برای تولید اعداد تصادفی استفاده کرده یک عدد (X)

را به عنوان عملوند ورودی الگوریتمش نیاز دارد که به این عدد seed گفته میشود.

در حالت اول مایکروسافت این عدد را از ساعت سیستم میگیرد !

اگر با توابع تولید اعداد تصادفی آشنایی داشته باشید، میدانید که وقتی در یک فرمول تولید اعداد، seed را ثابت در نظر نگیریم هر زمانی که تابع را اجرا کنیم سری اعداد تولید شده با سری قبل ،تفائت دارد. و از آنجایی که در حالت اول این اتفاق میافتد(seed با ساعت سیستم ست میشود) پس هر زمانی بخواهیم از اعداد تصادفی استفاده کنیم سری تولید شده با سری قبل متفاوت است.

اما در حالت دوم ما seed را دستی وارد میکنیم پس همیشه سری اعداد تولید شده با سری های قبلی یکسان است.

اما توجه کنید که وقتی seed را مثلا 100 میدهیم ،به این مفهوم نیست که عدد 100 اولین عدد تولید شده خواهد بود ! عدد 100 فقط یک عملوند است که در فرمول بلند بالای تولید اعداد تصادفی نقش بذر یا ماده اولیه را دارد .

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

برای اینکار متد های مختلفی در اختیار ما قرار دارد :

ما از قبل شئ Rand را تولید کرده بودیم پس :

1-متد Nextbytes

همانطور که مشخص است این متد یک آرایه از نوع بایت به عنوان ورودی میگیرد و تمامی خانه های آرایه را با اعداد تصادفی البته با ظرفیت نوع بایت (0-255)پر میکند برای مثال :

static void Main(string[] args)

{

Random Rand = new Random();

byte[] byteArr=new byte[20];

Rand.NextBytes(byteArr);

for (int i = 0; i <>

{

Console.WriteLine(byteArr[i]);

}

System.Console.Read();

}

در این برنامه ما یک آرایه 20 خانه ای از نوع بایت تعریف کردیم :

byte[] byteArr=new byte[20];

به خانه های آرایه اعداد تصادفی نسبت دادیم :NestBytesسپس با استفاده از متد

Rand.NextBytes(byteArr);

در نهایت نیز خانه های آرایه را پیمایش کرده و چاپ میکنیم :

for (int i = 0; i <>

{

Console.WriteLine(byteArr[i]);

}

خروجی در هر بار اجرا 20 عدد تصادفی متمایز است.(چرا؟!!)

Next2-متد

این متد نیز پیاده سازی های مختلفی دارد :

:1-2

بدون هیچ پارامتری :

Rand.Next()

این متد یک عدد Int غیر منفی را بر میگرداند

2-2 :

مشخص کردن سقف برای تولید اعداد :

در این حالت محدوده اعداد تصادفی تولید شده از 0 است تا یکی قبل از عدد وارد شده .

3-2:

تعیید کف و سقف :

این روش زمانی استفاده میشود که بخواهیم عدد تولید شده از مبنای صفر شروع نشود و بین بازه ای دلخواه باشد مثلا بین 43 تا 99 :

Rand.Next(43, 99);

3-متد NextDouble

همانگونه که از نام این متد پیداست، اعداد تصادفی بین 0 و 1 تولید میکند و هیچ پارامتری نیز نمیگیرد

البته با ضرب کردن مقدار برگشتی این متد با عدد مورد نظر(X)عدد تصادفی تولیدی از نوع اعشاری و در محدوده 0 تا X خواهد بود

مثال جامع برای متد های مختلف :

static void Main(string[] args)

{

Random Rand = new Random();

byte[] bytes = new byte[4];

Rand.NextBytes(bytes);

//پنج عدد تصادفی با در محدوده بایت

Console.WriteLine("Five random byte values:");

foreach (byte byteValue in bytes)

Console.Write("{0, 5}", byteValue);

Console.WriteLine();

//پنج عدد تصادفی تصادفی از نوع صحیح

Console.WriteLine("Five random integer values:");

for (int ctr = 0; ctr <= 4; ctr++)

Console.Write("{0,15:N0}", Rand.Next());

Console.WriteLine();

//پنج عدد تصادفی صحیح بین 0 تا 100

Console.WriteLine("Five random integers between 0 and 100:");

for (int ctr = 0; ctr <= 4; ctr++)

Console.Write("{0,8:N0}", Rand.Next(101));

Console.WriteLine();

//پنج عدد تصادفی صحیح بین 50 تا 100

Console.WriteLine("Five random integers between 50 and 100:");

for (int ctr = 0; ctr <= 4; ctr++)

Console.Write("{0,8:N0}", Rand.Next(50, 101));

Console.WriteLine();

//پنج عدد تصادفی بین 0 تا 1

Console.WriteLine("Five Doubles.");

for (int ctr = 0; ctr <= 4; ctr++)

Console.Write("{0,8:N3}", Rand.NextDouble());

Console.WriteLine();

//پنج عدد تصادفی اعشاری بین 0 تا 5

Console.WriteLine("Five Doubles between 0 and 5.");

for (int ctr = 0; ctr <= 4; ctr++)

Console.Write("{0,8:N3}", Rand.NextDouble() * 5);

System.Console.Read();

}

منبع : MSDN گردآوری: محمد صادق شیروان 1388/10/1




+ نسخه pdf و عکس دار!!
http://www.4shared.com/file/179074143/9d264d57/Random.html

1 comments:

ناشناس گفت...

سلام
خیلی ممنون
رشیدی