قبل شروع یکسری چیز ها هست که باعث شده این مقاله رو بزارم و به نظرم لازم بود که خدمت شما عزیزان بگم و اونم اینه که برای فهمیدن اینکه اعداد تصادفی و شبه تصادفی چیه خیلی سایت ، مقاله ، کامنت و ... هست ولی هیچکدوم یا کامل نبودن و یا ساده برای فهمیدن عوام نبودن برای همین خودمم خیلی اذیت شدم تا بتونم جوری یادبگیرم که بتونم به بقیه هم توضیح بدم تا بفهمن سر همین سعی کردم یه مقاله جامع و راحت برای فهمیدن بنویسم (لااقل خودم فک میکنم که اینطوره ;) )
کلا اعدادی که به آن ها تصادفی ، رخدادی و یا Random میگوییم در کامپیوتر به دو دسته تقسیم میشن:
1- True Random Number
2- Pseudo Random Number
* یه واقعیتی که باید بدونید اینه که هیچ چیزی تصادفی نیست هیچی! همه چیز تو این دنیا دلایل کامل قابل توجیه دارند مثلا اگر یک تاس رو پرتاب بکنیم نمیتونیم قاطعانه بگوییم که فلان عدد میاد برای همین به آن میگوییم یه عدد تصادفی ولی خارج از بحثمون بگم بهتون " توی آزمایشگاه های فیزیک با بررسی وزن ، میزان جاذبه، میزان فشار وارده و جهت فشار وارده و کلی فاکتور دیگه که تا جایی که در علم فیزیک کشف شده میتونیم قاطعانه بگوییم که با پرتاب تاس در فلان شرایط عددی که میاد چیه اما با توجه به این که ما در شرایط عادی توان بررسی این فاکتور هارو نداریم به آن ها اعداد تصادفی میگوییم." درواقع بشر به هر چیزی که نتونه اونو به راحتی پیشبینی کنه گفته یه پدیده تصادفی و برای همین ما هم چون به این راحتی ها نمیتونم تو زندگی روزمره عددی که پس از پرتاب تاس ظاهر میشه و یا اینکه سکه شیر میشه یا خط رو قاطعانه بگوییم به آن تصادفی میگوییم.
* واقعیت بعدی اینه که کامپیوترها توانایی تولید اعداد تصادفی واقعی رو ندارن و یه جورایی میتونن فقط اعدادی تولید کنند که تصادفی به نظر میرسن خب الان این سوال پیش میاد که چرا ؟
سادهاش اینه که چون کامپیوتر ها فقط یکسری کارهای از پیش تعیین شده را انجام میدن و نمیتونن برای خودشون تصمیم بگیرن و هر کاری خواستن بکنن
یکم علمیش میشه -> کامپیوتر ها ماشین هایی منطقی هستند که فقط یه سلسله مراتبی از دستورات و instruction هارا انجام میدهند و توانایی عملکرد هایی غیر منطقی خارج از دستورات رو ندارند.
1- اعداد تصادفی واقعی: تمام اعدادی که بر اساس پدیدههای فیزیکی هستن اعداد تصادفی واقعی هستند مثل میزان پرتوزایی ماده رادیواکتیو ، نوسانات صدای محیطی ، پرتاب سکه ، پرتاب تاس و ... کلا هرچیزی که به پدیدههای فیزیکی و اشیا فیزیکی مثل تاس و یا سکه مرتبط باشه میتونن اعداد تصادفی واقعی تولید کنند مثلا پرتوزایی یه ماده رادیواکتیو یه عدد رندوم یا تصادفی هستش مثلا بگم ، یه لحظه 200 گایگر یه لحظه دیگه 50 گایگر ، واقعا نمیتونم بگم الان عدد بعدی که ظاهر میشه چیه!! بنابراین این یک عدد تصادفی واقعی هستش.
2- اعداد شبه تصادفی: اعدادی که بر اساس یکسری الگوریتم های ریاضیاتی تولید میشوند که واقعا تصادفی نیستند و بر اساس یک روند قطعی تولید میشوند و بر همین اساس شبه تصادفی میگن بهشون.
- معایب اعداد تصادفی واقعی:
* سریع تولید نمیشوند -> چون بر اساس پدیده های فیزیکی هستند و برای تولید و اندازهگیری بسیار ناکارامد هستند.
* قابلیت تولید مجدد ندارند -> ممکن نیست دوباره همون عدد قبلی دقیقا تکرار بشه کاملا برعکس اعداد شبه تصادقی هستند. ( چون اونجا دقیقا با یک Seed تکراری یه سری اعداد تکراری تولید میشه.)
* به سختافزار خارجی نیاز هست -> برای سنجش هر پدیدهای به وسیلهای برای سنجش اون پدیده نیاز هست مثلا برای اندازهگیری میزان پرتوزایی.
- مزیت اعداد تصادفی واقعی:
*واقعا عدد تصادفی هستن.
- معایب اعداد شبه تصادفی:
* واقعا تصادفی نیستند.
- مزیت اعداد شبه تصادفی:
* برای تولید آن ها به دستگاه جانبی نیاز نداریم.
* راحت دوباره تولید میشوند اگر Seed را بدانیم.
* سریع و کارا هستند.
خب خوشبختانه بیشتر مواقع نیاز نداریم تا اعداد ، واقعا تصادفی باشند همین که تصادفی به نظر برسند کفایت میکنه.
خب یکم تاریخ بخونیم ;)
تو یکی از سال های دهی 40 میلادی (1946) ایدهای توسط آقای «جان فون نویمان» (John Von Neumann) مطرح شد که به وسیلهی اون میشد اعداد شبه تصادفی تولید کرد اسم این روش که هنوز هم در حال استفاده است Middle-Sqaure Alogorithm هستش که در ادامه توضیح میدم خدمتتون.
قبل از توضیح الگوریتم نیازه بدونید به عددی که نقطه شروع ما هستش Seed میگوییم.
- الگوریتم وسط مربع عدد: طرز کار این الگورتیم برای تولید اعداد شبه تصادفی به این صورته که یک عدد ورودی میگیره (اولین عددی که میگیره همون Seed هستش) و اونرو به توان دو میرسونه و بعد ارقام وسط جواب به دست امده رو جدا میکنه و دوباره همین عمل رو با همان ارقام وسط عدد انجام میده ( یعنی همون ارقام وسط عدد بدست آمده رو میگیره و به توان دو میرسونه دوباره ) . در واقع یک تابع بازگشتی هستش که عدد مرحله بعد از توان دو ارقام وسط عدد مرحله قبلیش بدست میاد.
Xn+1 = middle four digits of (Xn)^2
و بعد لهمر (D. H. Lehmer) یه ریاضیدان آمریکایی بود که از ایده نویمان استفاده کرد و در سال 1949 روشی به نام «تولید همسان خطی» (Linear Congruential Generator) را معرفی کرد. این روش به اختصار LCG نامیده میشود. در این روش از رابطه بازگشتی زیر استفاده میشود:
- روش LCG : تو این روش بازه اعدادی که تولید میشوند از 0 تا m - 1 هستند چون که هر جمله برابر هستش با باقی مانده "جمله قبل ضربدر یه عدد به اسم a به علاوه یه عدد دیگه به اسم b که معمولا a و b اعداد اول هستند"
Xn+1 = (a.Xn + b)mod m
متاسفانه توی ویرگول نمیشه یه فرمول رو راحت نوشت اون n+1 ایندکس هستش.
در این فرمول m عددی است که قرار است عبارت داخل پرانتز را برو اون تقسیم کنیم و باقی مانده آن را حساب کنیم که به آن modulus میگویند.
a عددی است که قرار است جمله قبل در آن ضرب شود که به آن multiplier میگویند.
b مقداری است که باید a.Xn را با آن جمع کنیم که به آن increment میگویند.
Seed میشه مقدار شروع (همون اولین عدد یا X0 )
و خلاصه اینکه کامپیوتر اینجوری از الگوریتم های گفته شده استفاده میکنه و عدد شبه تصادفی برای مسائلی مثل حرکت تصادفی دشمنان در بازی های کامپیوتری ، رمزنگاری ، هنر ، آمار و... تولید میکنه.
خیلی ممنون میشم اگر ایرادی در نوشته ها هستش حتما در نظرات بیان کنین تا از دانش شما عزیزان بهرهمند بشم و تصحیح کنم.
منابع:
https://blog.faradars.org/random-numbers/
https://stackoverflow.com/questions/12662810/generating-truly-random-numbers
https://virgool.io/@mahmoudetc/%D8%AA%D8%A7%D8%A8%D8%B9-%D8%B1%D9%86%D8%AF%D9%85-%D8%AF%D8%B1-%DA%A9%D8%A7%D9%85%D9%BE%DB%8C%D9%88%D8%AA%D8%B1-%DA%86%DA%AF%D9%88%D9%86%D9%87-%D8%B9%D9%85%D9%84-%D9%85%DB%8C%DA%A9%D9%86%D8%AF-l8e6kytws4tp