مولد اعداد شبه تصادفی
مولّد اعداد شبه تصادفی (انگلیسی: Pseudorandom number generator)، که به مولد قطعی (deterministic) اعداد شبه تصادفی نیز، معروف است ، الگوریتمی است که دنباله‌ای از اعداد را که با تقریب خوبی تصادفی هستند، تولید می‌کند. در واقع دنبالهٔ تولیدشده، واقعاً تصادفی نیست، بلکه به‌طور کامل قابل پیش‌بینی، و از روی حالت اولیهٔ الگوریتم، قابل محاسبه‌ است.
مولدهای اعداد تصادفی، مهم و کاربردی هستند. علت کاربرد گستردهٔ آن‌ها، توانایی تولید دوبارهٔ اعداد تولیدشدۀ قبلی و سرعت بالای تولید است. برای همین، از این الگوریتم‌ها در شبیه‌سازی‌ها (مثلاً روش مونت‌کارلو)، رمزنگاری، و بازی‌های کامپیوتری بسیار استفاده می‌شود. بیشتر الگوریتم‌های رمزنگاری نیاز دارند که خروجی‌شان غیرقابل پیش‌بینی باشد و این امر جز با استفاده از اعداد شبه تصادفی، میسر نمی‌شود.
در حالت کلی، بررسی‌های دقیق ریاضی لازم است تا تضمین شود که الگوریتمی، اعدادی تولید می‌کند که تا حد معقولی تصادفی هستند. جان فُون نُویمان به سوءبرداشت از الگوریتم‌های تولیدکنندهٔ اعداد تصادفی، اشاره کرده‌است و هشدار داده که همواره باید به تفاوت آن‌ها توجه کرد.
تجربه نشان می‌دهد خروجی‌های تولیدشده، به علت خطاهای موجود، راضی‌کننده نیستند و تعداد کمی از تست‌های آماری را به خوبی می‌گذرانند. می‌توان به تعدادی از این نقص‌ها، اشاره کرد؛
مولد های اعداد شبه تصادفی نقص های زیادی داشتند از نقص هایی که زیاد قابل توجه نبود گرفته تا نقص های بسیار آشکار. برای مثال RANDU که یک الگوریتم تولید اعداد تصادفی است ده ها برای رایانه هایmainframe استفاده میشد. این الگوریتم نقص های فراوانی داشت، با این وجود برای مدت بسیاری طولانی این نقص ها کشف نشدند.
در بسیار از زمینه ها، تحقیقاتی قبل از قرن بیست و یکم صورت گرفت که در آنها به انتخاب تصادفی یا شبیه سازی مونت کارلو متکلی بوده اند و یا به روش های دیگر وابسته به PRNG ها بودند. در این موارد اطمینان بسیار کمتر از حالتی است که از PRNG (مولد های اعداد شبه تصادفی)های بی کیفیت استفاده شود. حتی امروزه، برای احتیاط لازم است، هشداری که در زیر نشان داده شده است که در "دایره المعارف بین المللی علوم آماری" 2010 آمده است را نیز جدی گرفت.  مواردی از مولد هایی که باید بلااستفاده شوند و دور ریخته شوند بسیار بیشتر از مولد هایی های خوب است.بنابراین به فروشندگان نرام افزار بدون آگاهی اعتماد نکنید. RNG پیش فرض نرم افزار مورد علاقه ی تان را بررسی کنید. همچنین در صورت نیاز برای تعویض آن آماده باشید. این توصیه بارها طی 40 سال اخیر صورت گرفته است. امروز به طور شگفت آوری همان اندازه مرتبط و لازم است.
برای درک بهتر، زبان های برنامه نویسی را که به طور گسترده استفاده میشود را درنظر بگیرید. از سال 2017، جاوا هنوز برای تولید اعداد تصادفی، به یک مولد خطی سازگار (LCG)که کیفیت پایینی دارد، متکی است.
یکی از مولد های اعداد شبه تصادفی شناخته شده برای جلوگیری از بروز مشکلات بنیادی و همچین داشتن قابلیت اجرای نسبتا سریع، مرسن توئیستر (در ادامه مورد بحث است) بود که در سال 1998 منتشر شد. سایر مولد های تولید اعداد شبه تصادفی که کیفیت بالاتری در جهات محاسبات و کارایی آماری داشتند، قبل و بعد از این تاریخ توسعه یافتند. این موارد را لیست مولد های اعداد شبه تصادفی یافت.
در نیمه ی دوم قرن بیستم، الگوریتم های کلاس استانداری که برای PRNG ها استفاده میشد، مولدهای سازگار خطی را تشکیل می داد.کیفیت LCG ها کافی نبود اما روش های بهتری نیز وجود نداشت.Press et al در سال 2007  نتایج را اینگونه توصیف میکند:"اگر تمامی مقالات عملی ای که به علت LCG ها و موارد مرتبط در شک و شبه هستند، ناپدید شوند، در هر قفسه ی کتابخانه ها شکاف های بزرگی به‌وجود خواهد آمد."
هنگامی پیشرفت اصلی در ساخت مولد های اعداد شبه تصادفی به‌وجود آمد که تکنیک های مبتنی بر بازگشت خطی پدیدآمدند. چنین ژنراتورها مربوط به رجیسترهای تغییر فیدبک خطی هستند .
هنگامی پیشرفت اصلی در ساخت مولد های اعداد شبه تصادفی به‌وجود آمد که تکنیک های مبتنی بر بازگشت خطی پدیدآمدند. آنها مولد هایی هستند که دارای ثبات(رجیستر) های تغییر بازخورد خطی اند.
به طور ویژه اختراع مرسن چرخان ، در سال 1997، از بسیار از مشکلات مولد های پیشین جلوگیری کرد. مرسن چرخان دوره ای از  formula_1 تکرار (≈4.3×10)را دارد که ثابت شده است در 623 بعد (برای اعدا 32 بیتی) توزیع شده است. در آن زمان این شیوه از سایر مولد های آماری سریع تر بود.
در سال 2003، جورج Marsaglia خانواده ی مولد های xorshift را که مجددا بر اساس بازگشت خطی بود معرفی کرد. چنین مولدهایی بسیار سریع هستند و به همراه عملیات های غیرخطی آزمایش های آماری قوی و سختی را پشت سر گذاشتند.
در سال 2006 خانواده ی مولدهای WELL توسعه یافتند. مولد های خانواده ی well کیفیت مرسن توئیستر را در برخی جنبه ها بهبود دادند. Mersenne Twister دارای فضای حالتی بسیار بزرگ و سرعت بازیابی کمی بود که این بازیابی کند در فضاهای حالتی که تعداد زیادی صفر داشتند رخ میداد.
PRNG مناسب برای کاربردهای رمزنگاری ، یک "PRNG" با "رمزنگاری ایمن" (CSPRNG) نامیده میشود. یک الزام برای CSPRNG این است که طرفی که seed را نداند، تنها شانس بسیار ناچیزی برای تشخیص و تمایز توالی خروجی مولد از یک دنباله تصادفی دارد. به عبارت دیگر ، در حالی که یک PRNG فقط باید آزمون های آماری را پشت سر بگذارد ، یک CSPRNG باید تمام آزمون های آماری محدود شده به زمان چند جمله ای را در اندازه seed را بگذراند. گرچه اثبات این خاصیت فراتر از توانایی فعلی نظریه پیچیدگی محاسباتی است ، اما ممکن است با کاهش CSPRNG به مسئله ای که فرض بر آن است که از لحاظ محاسباتی سخت است ، مانند فاکتورسازی عدد صحیح ، شواهد محکمی بدست آید. به طور کلی ، ممکن سالها بررسی برای اینکه یک الگوریتم به عنوان CSPRNG تأیید شود، مورد نیاز باشد.
برخی از کلاس های CSPRNG شامل موارد زیر است: نشان داده شده است که به احتمال زیاد آژانس امنیت ملی آمریکا یک درپشتی نامتقارن به NIST قرار داده بود. NIST مولد اعداد شبه تصادفی Dual_EC_DRBG را گواهی میکند.
اکثر الگوریتم های PRNG توالی هایی تولید می کنند که به طور یکنواخت توسط آزمون های گوناگون توزیع میشوند. این یک سؤال بدون پاسخ است ، و یک موضوع اصلی برای تئوری و عمل رمزنگاری است که آیا راهی برای تمایز خروجی یک PRNG با کیفیت بالا از یک دنباله واقعاً تصادفی وجود دارد؟ در این تنظیم ، تشخیص دهنده می داند که یا از الگوریتم شناخته شده PRNG استفاده شده است (اما نه وضعیتی که با آن آغاز شد) یا از یک الگوریتم واقعاً تصادفی استفاده شده است ، و باید بین این دو تفاوت قایل شود. امنیت اکثر الگوریتم های رمزنگاری و پروتکل های با استفاده از PRNG برفرض آن بناشده اند که تشخیص استفاده از PRNG مناسب از استفاده از یک توالی واقعاً غیرممکن است. ساده ترین نمونه های این وابستگی ، رمزنگاری های جریانی هستند ، که (اغلب) با یای انحصاری بین متن ساده (رمزنشده) پیام و خروجی PRNG کار می کنند و متن رمزشده را تولید می کنند. طراحی PRNG های مناسب از نظر رمزنگاری بسیار دشوار است زیرا آنها باید معیارهای بیشتری را رعایت کنند. اندازه دوره ی تناوب آنها یک عامل مهم تعیین میزان مناسب بودن رمزنگاری یک PRNG است ، اما به تنهایی کافی نیست.
دفتر امنیت اطلاعات فدرال آلمان ( "Bundesamt für Sicherheit in der Informationstechnik" ، BSI) چهار معیار برای ارزیابی کیفیت مولد های اعداد تصادفی قطعی تعیین کرده است. این موارد به صورت زیر خلاصه می شوند: برای کاربرد های رمزنگاری، فقط مولد هایی که موارد K3 و K4 را رعایت کنند، قابل قبول میباشند.
داده شده (در صورتی که) ما یک تابع formula_20 (جایی که formula_21 مجموعه اعداد صحیح مثبت است) را یک مولد عدد شبه تصادفی برای formula_2 به طوری که formula_5 مقادیر formula_12 را میگیرد مینامیم اگر و تنها اگر ( formula_27 نشان دهنده تعداد اعضای مجموعه متناهی S است. )
می توان نشان داد که اگر formula_28 مولد عدد شبه تصادفی برای توزیع یکنواخت بر روی بازه ی formula_29 باشد و اگر formula_30 تابع توزیع تجمعی برای توزیع توزیع احتمالی داده شده formula_2 باشد، سپس formula_32 مولد اعداد شبه تصادفی برای formula_2 است ، به طوری که formula_34 صدک formula_2 است ، یعنی formula_36 . به طور شهودی ،یک توزیع دلخواه میتواند توسط یک توزیع استاندارد یکنواخت شبیه سازی شود.
یکی از روش‌های اولیهٔ مبتنی بر کامپیوتر، به وسیلهٔ فُون نویمان در سال ۱۹۴۶ ارائه شد. این روش به روش «میان-مربع» (Middle-Square) معروف است («میانِ مربع» یا «مربعِ میانی» خوانده نشود)؛ یک عدد دلخواه در نظر گرفته، آن را به توان ۲ برسانید (مربع کنید)، ۴ رقم میانی آن را به عنوان یک عدد تصادفی جدید در نظر بگیرید و آن‌ را به‌عنوان عدد بعدی در الگوریتم استفاده کنید و به این کار ادامه دهید.
مثلاً با شروع از عدد ۱۱۱۱، عدد ۱۲۳۴۳۲۱ حاصل می‌شود، که اگر آن را به صورت هشت رقمی بنویسیم، ۰۱۲۳۴۳۲۱ به دست می‌آید. عدد ۲۳۴۳ به عنوان یک عدد تصادفی به دست می‌آید. با تکرار این عمل روی ۲۳۴۳ به ۴۸۹۶ به عنوان عدد تصادفی بعدی خواهیم رسید. می‌توان همین روند را ادامه داد. اگر در روش اصلی از اعداد ۵ رقمی استفاده می‌شد، روند کاملاً مشابه می‌بود.
در این الگوریتم، پس از تعدادی مرحله به عددی تکراری خواهیم رسید. مشکل اینجاست که به‌ازای بعضی از اعداد ورودی، این اتفاق به سرعت می‌افتد. فون نویمان از این مشکل مطلع بود، اما روش ارائه‌شده برای کاربرد موردنظر، کافی بود.
فون نویمان، تولیدکننده‌های سخت‌افزاری اعداد تصادفی را غیرمناسب می‌دانست. چراکه اگر خروجی‌های تولیدشده ذخیره نمی‌شد، بعداً امکان بازتولید آن‌ها و تست‌کردن خطا وجود نداشت. در حالتی هم که خروجی‌ها را ذخیره می‌کردند، حافظه به هدر می‌رفت. اگر اعداد تولیدشده روی کارت پانچ ذخیره می‌شد، زمان خواندن و نوشتن آن‌ها طولانی می‌شد، درحالی‌که استفاده از روش «میان-مربع» سرعتی صدها برابر بیشتر از سرعت خواندن و نوشتن از کارت پانچ داشت.
از آن زمان ، روش مربع میانی توسط مولدهای دقیق تر تعویض شد.
یک نوآوری تازه ترکیب مربع میانه با دنباله Weyl میباشد . این روش در مدت زمان طولانی تولید خروجی به کیفیت بالا دست میابد (رجوع کنید به توالی PRNG دنباله میدانی Weyl ).
تعداد انتخاب شده از توزیع احتمال غیر یکنواخت را می توان با استفاده از یک توزیع PRNG یکنواخت و تابعی که مربوط به این دو توزیع باشد ، تولید کرد.
اعداد انتخاب شده از یک توزیع احتمالاتی غیریکنواخت میتواند توسط یک توزیع یکنواخت PRNG و یک تابع که دو توزیع را به هم مرتبط کند، تولید شود.
ابتدا به تایع توزیع تجمعی نیاز داریم formula_37 توزیع هدف formula_38 (تابع F توزیع تجمعی f است):
توجه داشته باشید که formula_40 . با استفاده از عدد تصادفی "c" که از توزیع یکنواخت آمده است ،به عنوان چگالی احتمال، دریافت می کنیم:
در نتیجه
عددی است که به طور تصادفی از توزیع formula_38 انتخاب شده است .
به طور مثال، وارونه توزیع گاوی تجمعی formula_44 با یک PRNG یکنواخت ایده آل با دامنه (0 ، 1) که ورودی formula_45 توالی از مقادیر (فقط مثبت) با توزیع گاوسی را تولید می کند. با این حال ملاحظات مشابهی برای تولید توزیع های غیر یکنواخت دیگر مانند ریلی و پواسون صورت میگیرد.