شما اینجا هستید

۳-۰ احتمالات و توزیع غیر یکنواخت

پیغام خطا

Deprecated function: The each() function is deprecated. This message will be suppressed on further calls در book_prev() (خط 775 در /home/molavy/public_html/modules/book/book.module).

اولین باری که شروع به برنامه نویسی در processing کردید را به خاطر می آورید؟ شاید شما می خواستید دایره های بسیاری را روی صفحه ترسیم کنید. بنابراین شما به خودتان گفتید: آهان، میدونم. دایره ها را با موقعیت تصادفی روی صفحه ترسیم می کنم، ما اندازه های تصادفی و رنگ های تصادفی. در یک سیستم گرافیک رایانه ای، آسانترین راه برای راه اندازی یک سیستم اغلب استفاده از تصادفی بودن است. در این کتاب، اما، ما به دنبال ساخت و مدل کردن یک سیستم بر اساس آنچه در طبیعت می بینیم، هستیم.

به صورت پیشفرض تصادفی بودن یک بخش از راه حل معمول برای مشکلات طراحی نیست. معمولا این نوع از مشکلات در بردارنده ساخت یک عامل زیستی یا شبیه سازی شبه طبیعت است.

با چند فن، ما می توانیم از راهی که برای تولید اعداد تصادفی استفاده می شود(تابع random) برای تولید اعداد تصادفی با توزیع غیر یکنواخت استفاده کنیم.

این موارد در بخش های مختلف کتاب به اشکال مختلف مورد استفاده قرار می گیرند. برای مثال، ما نیاز به روش هایی برای پیاده سازی «انتخاب» خواهیم داشت که کدام اعضای جامعه منتخب باید DNA خود را به نسل بعد منتقل کنند؟ مفهوم انتخاب اصلح در به خاطر می آورید؟ اجازه بدهید بگوییم ما جمعیتی از میمون های در حال تکامل داریم. همه میمون ها به اندازه یکسان شانس تولید مثل ندارند. برای شبیه سازی نظریه تکامل داروین، ما نمیتوانیم به صورت تصادفی دو میمون را به صورت تصادفی به عنوان والدین انتخاب کنید. ما نیاز داریم که از میان آنها بهترین ها را برای انتخاب استفاده کنیم. ما نیاز به تعریف احتمال اصلح داریم. برای مثال، معمولا میمون های قوی و سریع به احتمال ۹۰٪ و میمون های ضعیف تر با احتمال ۱۰٪ می توانند تولیدمثل کنند.

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

اگر شما یک سیستم با تعداد مشخصی از خروجی محتمل داشته باشید، احتمال روی دادن رویداد های مورد انتظار برابر با تعداد خروجی های مورد انتظار داده شده تقسیم بر مجموع همه خروجی های ممکن است. انداختن یک سکه یک مثال ساده است. در این حالت تنها دو خروجی ممکن است، شیر یا خط.تنها یک راه وجود دارد یک شیر بیاید. بنابراین احتمال اینکه شیر بیاید برابر است با ۱ تقسیم بر ۲ : ۱/۲ یا ۵۰٪ .

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

تعداد کارتهای تک / تعداد کل کارت ها =

۴ / ۵۲ = ۰.۰۷۷ = ~٪۸

 

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

تعداد کل خشت ها / تعداد کل کارت ها =

۱۳ / ۵۲ = ۰.۲۵ =٪۲۵

ما همچنین می توانیم احتمال چندین رویداد متوالی را بررسی کنیم. برای این کار، ما به سادگی احتمال هرکدام را در بعدی ضرب می کنیم.

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

(۱‍/۲) * (۱/۲) * (۱/۲) = ۱/۸ ( یا ۰.۱۲۵)

یعنی اینکه ممکن است در هشت بار انداختن سه سکه یک بار هر سه تا شیر بیاید.

 

تمرین:

احتمال اینکه دو کارت تک پشت سر هم از ۵۲ کارت رو شود چقدر است.

 

چندین راه برای استفاده از تابع random با احتمال وجود دارد .یک راه این است که آرایه ای را با تعداد مشخصی از اعداد پر کنیم. بعضی از اعداد تکرار می شوند. سپس یک عدد تصادفی از آرایه انتخاب می کنیم و یک یک رویداد بر اساس هر عدد تعریف می کنیم.

 

int[] stuff = new int[5]
stuff[0] = 1;
stuff[1] = 1;
stuff[2] = 2;
stuff[3] = 3;
stuff[4] = 3;
int index = int(random(stuff.length));

اجرای این کد با احتمال ۴۰٪ دارای شانس چاپ مقدار ۱ است، با ۲۰٪ احتمال چاپ مقدار ۲ است و یا ۴۰٪ احتمال چاپ مقدار ۳ است.

ما همچنین می توانیم یک مقدار تصادفی را درخواست کنیم( اجازه بدهید موضوع را ساده کنیم و فقط مقدار ممیز شناور بین صفر تا یک را در نظر بگیریم) و به یک رویداد اجازه بدهیم که تنها در زمانی که مقدار تصادفی در یک بازه ای بود اتفاق بیفتد.برای مثال:

 

 float prob = 0.10;
float r = random(1);
 
if (r < prob) {
   // try again!
}

این شیوه همچنین می تواند با ضرب خروجی ها به کار برده شود.اجازه بدهیم بگویم خروجی حرف A دارای ۶۰٪ احتمال است و خروجی B دارای ۱۰٪ احتمال است و خروجی C دارای 30% احتمال است. ما این کد را انتخاب یک عدد تصادفی و بررسی اینکه در چه بازه ای اتفاق افتاده است پیاده سازی کردیم.

بین صفر تا ۰.۶۰ (۶۰٪) -> خروجی A

بین ۰.۶۰ تا ۰.۷۰ (۱۰٪) -> خروجی B

بین ۰.۷۰ تا ۱.۰۰ (۳۰٪) خروجی C

 

float num = random(1);
 
if (num < 0.6) {
  println("Outcome A");
} else if (num < 0.7) {
  println("Outcome B");
} else {
  println("Outcome C");
} 

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

احتمال حرکت به بالا ۲۰٪

احتمال حرکت به پایین ۲۰٪

احتمال حرکت به چپ ۲۰٪

احتمال حرکت به راست ۴۰٪

 

Your browser does not support the canvas tag.

 

 void step() {
 
    float r = random(1);
    if (r < 0.4) {
      x++;
    } else if (r < 0.6) {
      x--;
    } else if (r < 0.8) {
      y++;
    } else {
      y--;
    }
  }

تمرین ۳  یک گردشگر تصادفی با احتمال پویا بسازید. برای مثال، آیا می توانید احتمال ۵۰٪ با حرکت موس به یک سمت به آن بدهید؟

دیدگاه جدیدی بگذارید