الگوریتم های تولید عدد تصادفی به دو دسته ی اصلی تقسیم می شوند:
1- تولیدکننده های شبه تصادفی (PRNG): مزیتشان سرعت و قابلیت تکرار است، اما ضعفشان پیش بینی پذیری است.
2- تولیدکننده های تصادفی حقیقی (TRNG): مزیتشان غیرقابل پیش بینی هستند، اما کندتر و سخت تر پیاده سازی می شوند.
نمونه هایی از Pseudo-Random Number Generators:
- Linear Congruential Generator (LCG)
- Mersenne Twister (MT19937)
- Xorshift / XORWOW
- Cryptographically Secure Pseudo-Random Number Generator (CSPRNG)
- Ziggurat Algorithm
نمونه هایی از True Random Number Generators:
- Thermal Noise (Johnson–Nyquist Noise)
- Shot Noise
- Avalanche Noise
- Photon Detection Randomness
- Quantum Tunneling
- Radioactive Decay
- Oscillator Jitter
- Chaotic Circuits
- Atmospheric Noise
اما بیشتر توسعه دهندگان نرم افزار و بازی یا متخصصان امنیت و رمزنگاری از الگوریتم های زیر استفاده می کنند:
- توسعه دهندگان بازی و گرافیک: بیشتر از Xorshift.
- دانشگاهی ها و پژوهشگران: بیشتر از Mersenne Twister و Ziggurat.
- برنامه نویسان قدیمی یا پروژه های ساده: LCG.
- متخصصان امنیت و رمزنگاری: CSPRNG و نویز الکتریکی و کوانتومی.
در شبیه سازی، یادگیری ماشین و آمار به توزیع های خاص مثل Normal (Gaussian) یا Exponential نیاز هست که الگوریتم های قدیمی کند بوده و فقط اعداد Uniform تولید می کنند. برای همین Ziggurat Algorithm برای تولید اعداد تصادفی با توزیع های خاص (مثل Gaussian یا Exponential) محبوب شده است که مزایا و معایب به شرح زیر است:
مزایا:
1- سرعت بالا: به طور قابل توجهی سریع تر از روش های کلاسیک مثل Box-Muller.
2- کارآمدی: بیشتر نمونه ها با محاسبات ساده تولید می شوند و فقط درصد کمی نیاز به محاسبات پیچیده دارند.
3- انعطاف پذیر: برای توزیع های مختلف (Gaussian, Exponential) قابل استفاده است.
4- بهینه برای نرم افزار و سخت افزار: در کتابخانه های زبان های برنامه نویسی و حتی GPUها استفاده می شود.
معایب:
1- پیچیدگی پیاده سازی: نیاز به جداول از پیش محاسبه شده دارد.
2- حساسیت به دقت عددی: اگر جداول یا محاسبات دقیق نباشند، کیفیت آماری خروجی کاهش می یابد.
3- کمتر شهودی: نسبت به روش های ساده تر مثل Box-Muller، فهم و آموزش آن سخت تر است.
مقاله زیر توضیح می دهد که چگونه می توان در SQL Server با استفاده از الگوریتم زیگورات (Ziggurat Algorithm) و بدون نیاز به ابزارهای خارجی اعداد تصادفی با توزیع های نمایی (Exponential) و گاوسی (Gaussian/Normal) تولید کرد:
https://www.mssqltips.com/sqlservertip/11547/
سید حامد واحدی
4 آذر 1404