چجوری اعداد رندم در کامپیوترهامون تولید میشه


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

به طور کلی، تولید اعداد تصادفی در کامپیوتر با استفاده از الگوریتم‌های ریاضی صورت میگیره . این الگوریتم‌ها از یک seed اولیه شروع می‌کنند و با استفاده از محاسبات مختلف، اعداد تصادفی را تولید می‌کنند. اما آیا این اعداد واقعاً تصادفی هستند یا نه؟ بیایید به صورت دقیق‌تر بررسی کنیم.

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

الگوریتم‌های تولید اعداد تصادفی در کامپیوتر از بذر اولیه (seed) برای تولید اعداد تصادفی استفاده می‌کنند. بذر اولیه معمولاً از طریق ساعت سیستمی یا متغیرهای فیزیکی مانند زمان ورود کاربر به برنامه‌ای که اعداد تصادفی تولید می‌کند، مقداردهی می‌شود. با استفاده از بذر اولیه، الگوریتم تصادفی اعداد تصادفی را تولید می‌کند و این عدد تولید شده به عنوان بذر برای تولید اعداد تصادفی بعدی استفاده می‌شود. با تغییر بذر اولیه، سری اعداد تولید شده نیز تغییر می‌کند.

بنابراین، اعداد تولید شده توسط کامپیوتر به صورت تصادفی به نظر می‌رسند، زیرا در هر بار اجرا، بذر اولیه متفاوت تولید می‌شود و الگوریتم تصادفی با استفاده از آن، نتایج متفاوتی تولید می‌کند. با این حال، باید توجه داشت که اعداد تولید شده توسط کامپیوتر در واقع محصول یک الگوریتم محاسباتی هستند و به صورت دقیق و کامل تصادفی نیستند.

به عنوان مثال، فرض کنید یک الگوریتم ساده تصادفی داشته باشیم که با استفاده از بذر اولیه، یک سری اعداد تصادفی ایجاد می‌کند. اگر بذر اولیه به صورت کاملاً قابل پیش‌بینی تنظیم شود (به طوری که همیشه یک عدد خاص تولید بشه)، آنگاه تمام اعداد تولید شده توسط الگوریتم قابل پیش‌بینی خواهند بود و تصادفی به نظر نخواهند رسید. اما اگر بذر اولیه به صورت کاملاً تصادفی تنظیم شود (مثلاً با استفاده از زمان سیستمی به عنوان بذر اولیه)، آنگاه اعداد تولید شده توسط الگوریتم به نظر تصادفی خواهند رسید.


الگوریتم‌های تولید اعداد تصادفی در کامپیوتر معمولاً بر اساس مفاهیم ریاضی و احتمالاتی کار می‌کنند. یکی از الگوریتم‌های معروف برای تولید اعداد تصادفی در کامپیوتر، الگوریتم مولد خطی میانگینی (Linear Congruential Generator) است. این الگوریتم با استفاده از یک فرمول ریاضی ساده، اعداد تصادفی را تولید می‌کند.

فرمول عمومی الگوریتم مولد خطی میانگینی به صورت زیر است:

Xn+1 = (a * Xn + c) mod m

در این فرمول، Xn نشان دهنده عدد تصادفی قبلی است، Xn+1 عدد تصادفی جدید است که تولید می‌شود، a و c پارامترهای ثابتی هستند که انتخاب شده‌اند و m مقداری ثابت است. عملگر mod نشان دهنده باقی مانده‌ی تقسیم است.

بذر اولیه (seed) همان X0 در فرمول است و برای هر بار اجرا می‌تواند مقدار دلخواهی داشته باشد. با تغییر بذر اولیه، سری اعداد تولید شده نیز تغییر خواهند کرد.

هرچند که الگوریتم مولد خطی میانگینی به سادگی قابل پیاده‌سازی است و در بسیاری از کاربردها مورد استفاده قرار می‌گیرد، اما دارای محدودیت‌هایی است. به عنوان مثال، اگر پارامترهای a، c و m به درستی انتخاب نشوند، الگوریتم ممکن است به جای اعداد تصادفی، یک سری اعداد متناوب تولید کند. همچنین، اعداد تولید شده توسط این الگوریتم در بعضی موارد پیرو الگوهای خاصی هستند و از توزیع تصادفی یکنواخت فاصله دارند.

بنابراین، برای کاربردهایی که نیاز به اعداد تصادفی با دقت بالا و ویژگی‌های آماری خاص دارند، از الگوریتم‌های پیچیده‌تر و قوی‌تری استفاده می‌شود. الگوریتم‌هایی مانند Mersenne Twister و XORShift، که از روش‌های پیچیده‌تری برای تولید اعداد تصادفی استفاده می‌کنند، مورد استفاده رایج هستند.

همچنین، در برخی موارد خاص مانند شبیه‌سازی‌های علمی یا رمزنگاری،می‌توان از منابع تصادفی خارجی نیز استفاده کرد. برای مثال، برخی سیستم‌ها از تغییرات زمینه‌ای فیزیکی مانند نویز ترمودینامیکی یا تابش کیهانی به عنوان منبع تصادفی استفاده می‌کنند.

در کل، تولید اعداد تصادفی در کامپیوتر یک حوزه پژوهشی مهم است و متخصصان در زمینه ریاضیات، احتمالات و علوم کامپیوتر با استفاده از الگوریتم‌ها و روش‌های مختلف، سعی در تولید اعداد تصادفی با ویژگی‌های مورد نیاز دارند. هدف اصلی در این حوزه، تأمین اعداد تصادفی با توزیع یکنواخت و خروجی پیروی از الگوی تصادفی است که در بسیاری از کاربردها مورد نیاز است.

برای کاربردهایی که نیاز به اعداد تصادفی با دقت بالا دارند، مانند شبیه‌سازی‌های علمی یا رمزنگاری، از الگوریتم‌های پیچیده‌تر و قوی‌تری برای تولید اعداد تصادفی استفاده می‌شود. این الگوریتم‌ها بر اساس مفاهیم ریاضی و فیزیکی پیچیده‌تری عمل می‌کنند و تلاش می‌کنند تا اعداد تولید شده به حد ممکن به تصادفیت واقعی نزدیک شوند.