کنترل تولید اعداد تصادفی

ممکن است برای شما این سوال پیش آمده باشد که چرا ما اینقدر بر روی تولید اعداد تصادفی تاکید میکنیم و اصلا چه لزومی برای این کار وجود دارد. ساده ترین جواب این است که بسیاری از دوستان از اعداد تصادفی به طرق اشتباهی در برنامه هایشان استفاده می کنند و از آنجایی که روند ایجاد اعداد تصادفی چیزی نیست که به راحتی بتوان دیباگ کرد(به خاطر اینکه ما انتظار رفتار خاصی از یک دنباله تصادفی نداریم) یافتن منبع اشتباه در برنامه بسیار دشوار می شود. برای حل این مشکل متلب تابعی به نام rng قرار داده است که نوع تولید اعداد تصادفی را مشخص کرده و هر بار دانه اولیه را هم میگیرد. به این ترتیب می توانید الگوریتم خودتان را با یک دنباله تکرار شدنی از اعداد تصادفی تست کنید و سپس قسمتهایی از کد را که فکر می کنید مشکل دارند تغییر دهید. برای شروع در خط فرمان تابع زیر را وارد کنید تا مقادیر را ببینیدهمانطور که می بینید نوع ساخت عدد تصادفی Mersenne Twister است و دانه آن برابر با صفر است و وضعیت آن هم در یک ماتریس ذخیره شده است. حالا دستور rand را وارد میکنیم تا نتیجه را ببینیم:سپس تولید اعداد شبه تصادفی را به حالت اول بر میگردانیم و دوباره تابع rand را اجرا میکنیمهمانطور که می بینید دوباره همان اعداد تولید شدند! این برای دیباگ کردن برنامه هایی که از اعداد رندم استفاده میکنند عالی است!نسخه کنونی متلب از الگوریتم Mersenne Twister برای تولید اعداد شبه تصادفی استفاده میکند[1]. الگوریتم های دیگری هم برای این کار وجود دارند که می توانید در help متلب با تایپ کردن rng بیابید. (مانند SIMD fast Mersenne Twister، Combined Multiple Recursive و Multiplicative Lagged Fibonacci) هر بار که متلب ریستارت می شود. دانه آن به مقدار قبلی (یعنی صفر) ست می شود!( اگر باور نمی کنید متلب را باز کنید تابع Rand را اجرا کنید مقدار را به خاطر بسپارید و سپس متلب را ببندید و دوباره باز کنید و باز هم Rand را بزنید) برای اینکه این مشکل را حل کنید دستور زیر را وارد کنید:این دستور باعث می شد دانه الگوریتم به زمان تنظیم آن ست شود(یک راه حل ساده و هوشمندانه!).در قسمت قبل شما را تشویق کردم که در مورد تولید اعداد واقعا تصادفی فکر کنید! از آنجا که کامپیوتر های کنونی ماشین های محاسبه متعین(deterministic ) ایی هستند نمی توان هیچ الگوریتمی برای تولید اعداد تصادفی ایجاد کرد. مهمترین روش تولید اعداد تصادفی استفاده از یک فرآیند فیزیکی مانند نویز حرارتی، اثر فوتوالکتریک یا پدیده ای کوانتومی است. این فرآیند ها غیر قابل پیش بینی هستند[2] و بنابراین پایه ای برای تولید اعداد واقعا تصادفی هستند. مثلا میزان گرمای حرارتی پردازنده یا حالت کوانتومی بخشی از حافظه می تواند مورد استفاده قرار گیرد. سیستم عامل مسیری برای تولید این اعداد را فراهم میسازد. تولید این اعداد از ویندوز 2000 دچار مشکلاتی بود که در سال 2008 برطرف شد[3]. در سیستم عامل های یونکیسی هم از /dev/random استفاده می شود که بسیار مقاوم تر(robust) از نسخه های ویندوزی است. اعداد تصادفی واقعی بیشترین کاربرد را در رمزنگاری و شبیه سازی (مانند Monte carlo) دارند. از آنجا که حمله های مبتنی بر تولید اعداد تصادفی بسیار مهلک هستند تولید اعداد "واقعا" تصادفی بسیار مهم است. سایتی به نام random.org ادعا می کند که اعداد واقعا تصادفی بر اساس نویز اتمسفری تولید میکند که برای استفاده از آن در متلب یک واسط وب طراحی شده است که من تغییراتی در آن داده ام تا قابل استفاده باشد. در زیر می توانید دانلود کنیدhttps://gist.github.com/roholazandie/a0d5d7907af30828514bf1fd1ee758d4استفاده از این اسکریپت بسیار ساده است. چند مورد را ببینید: ( می توانید آن را به path اضافه کنید تا همیشه داشته باشیدش)به خاطر داشته باشید که هر بار که این تابع را صدا می زنید یک HTTPS GET انجام می شود که البته زمانبر است. پس در صورتی که خارج از ایران هستید یا نیاز شدید دارید می توانید از آن استفاده کنید.منابع:[1] https://en.wikipedia.org/wiki/Mersenne_Twister[2] Pironio, Stefano, Antonio Acín, Serge Massar, A. Boyer de La Giroday, Dzimitry N. Matsukevich, Peter Maunz, Steven Olmschenk et al. "Random numbers certified by Bell’s theorem." Nature 464, no. 7291 (2010): 1021-1024.[3] http://www.computerworld.com/article/2539986/security0/microsoft-confirms-that-xp-contains-random-number-generator-bug.html