مولد عدد چیست؟
مولد اعداد یک فرآیند، الگوریتم یا دستگاه فیزیکی است که دنبالهای از اعداد را تولید میکند که مقادیر آنها را نمیتوان از قبل به طور کامل توسط شخص یا سیستم دریافتکننده پیشبینی کرد. خروجی ممکن است یک عدد واحد یا یک دنباله دلخواه طولانی باشد که از یک محدوده، توزیع یا مجموعهای از قوانین تعریف شده گرفته شده است. مولدهای اعداد در محاسبات، آمار، رمزنگاری، بازی، شبیهسازی علمی و تصمیمگیریهای روزمره ظاهر میشوند و آنها را به یکی از پرکاربردترین ابزارها در ریاضیات و مهندسی مدرن تبدیل میکنند.
تمایز اساسی بین تصادفی بودن واقعی و تقریب محاسباتی تصادفی بودن است. اکثر مولدهای عدد در نرمافزار واقعاً تصادفی نیستند - آنها الگوریتمهای قطعی هستند که خروجی را از نظر آماری چنان غیرقابل پیشبینی تولید میکنند که برای اکثر اهداف عملی مانند تصادفی بودن رفتار میکند. دسته کوچکتری از مولدها، عدم قطعیت فیزیکی واقعی را برای تولید اعدادی که هیچ الگوریتمی نمیتواند آنها را تولید کند، برداشت میکنند. درک اینکه از کدام نوع مولد استفاده میکنید بسیار مهم است، زیرا عواقب انتخاب مولد اشتباه از نتایج تحقیقات ناقص تا شکستهای امنیتی فاجعهبار متغیر است.
چرا مولدهای اعداد مهم هستند؟
مولدهای عدد، زیرساختهای اساسی در طیف وسیعی از زمینهها هستند. کیفیت آنها مستقیماً اعتبار نتایج را در هر حوزه تعیین میکند.
- رمزنگاری و امنیت: کلیدهای رمزگذاری، توکنهای جلسه، نانسها و رمزهای عبور یکبار مصرف باید از منابعی تولید شوند که از نظر محاسباتی غیرقابل پیشبینی هستند. یک مولد ضعیف در اینجا میتواند میلیونها کاربر را در معرض حمله قرار دهد. آسیبپذیری OpenSSL دبیان در سال ۲۰۰۸، که ناشی از کاهش ناخواسته در بذر آنتروپی بود، کلیدهای خصوصی را قابل حدس کرد و سرورهای سراسر جهان را به خطر انداخت.
- شبیهسازی علمی: روشهای مونت کارلو که در فیزیک، امور مالی، مدلسازی آب و هوا و کشف دارو استفاده میشوند، برای یافتن راهحلهای تقریبی برای مسائلی که از نظر تحلیلی غیرقابل حل هستند، به توالیهای بزرگی از اعداد تصادفی متکی هستند. کیفیت آماری مولد مستقیماً بر دقت شبیهسازی تأثیر میگذارد.
- نمونهگیری آماری: تحقیقات پیمایشی، آزمایشهای بالینی و ممیزیهای کنترل کیفیت به انتخاب تصادفی وابسته هستند تا اطمینان حاصل شود که نمونهها بدون سوگیری، نماینده جمعیت خود هستند. یک مولد با الگوهای پنهان میتواند بهطور سیستماتیک نتایج خاصی را حذف کند و نتیجهگیریها را بیاعتبار سازد.
- بازی و قمار: انصاف در بازیهای کارتی، لاتاریها، دستگاههای اسلات و کازینوهای آنلاین از نظر قانونی و اخلاقی منوط به تولید اعداد غیرقابل پیشبینی است. نهادهای نظارتی در اکثر حوزههای قضایی، مولدهای اعداد تصادفی دارای مجوز را الزامی میدانند.
- تولید محتوای رویهای: بازیهای ویدیویی با استفاده از توالیهای شبهتصادفیِ هدفمند، زمین، سیاهچالها، رفتار دشمن و غنایم را تولید میکنند و امکان ایجاد جهانهای وسیع و متنوع را از طریق کد فشرده فراهم میکنند.
- تصمیمات روزمره: انتخاب برنده از یک قرعهکشی، اختصاص دادن دانشآموزان به گروهها، تصادفی کردن یک لیست پخش یا انتخاب یک رستوران - مولدهای اعداد، تصمیمگیری بیطرفانه را در هر مقیاسی انجام میدهند.
دو نوع اساسی مولدهای عدد
هر مولد عدد به یکی از دو دسته کلی تعلق دارد که بر اساس منبع غیرقابل پیشبینی بودنشان از هم متمایز میشوند.
مولدهای اعداد شبه تصادفی (PRNG)
یک مولد اعداد شبهتصادفی، یک الگوریتم قطعی است که یک مقدار اولیه به نام سید (seed) را میگیرد و یک تابع ریاضی را به طور مکرر برای تولید دنبالهای از اعداد اعمال میکند. با توجه به سید یکسان، یک PRNG همیشه دقیقاً همان دنباله را تولید میکند. این دنباله به معنای دقیق ریاضی تصادفی نیست - کاملاً توسط سید تعیین میشود - اما آزمونهای آماری تصادفی بودن را پشت سر میگذارد و برای اکثر کاربردهای غیر رمزنگاری مناسب است.
مکانیسم اصلی شامل حفظ یک حالت داخلی است، بلوکی از بیتها که در هر مرحله تبدیل میشود. خروجی از این حالت مشتق میشود و حالت قبل از تولید خروجی بعدی بهروزرسانی میشود. طول دنباله قبل از تکرار، دوره تناوب نامیده میشود. یک PRNG خوب دوره تناوبی آنقدر طولانی دارد که در عمل هرگز با تکرار مواجه نمیشود.
الگوریتمهای رایج PRNG عبارتند از:
- مولد همنهشتی خطی (LCG): یکی از قدیمیترین و سادهترین PRNGها، با استفاده از فرمول X n+1 = (aX n + c) mod m . پیادهسازی سریع و آسان، اما با نقاط ضعف شناختهشده از جمله دورههای کوتاه و الگوهای قابل تشخیص در ابعاد بالاتر. در بسیاری از زبانهای برنامهنویسی اولیه استفاده میشد و هنوز هم در برخی از کتابخانههای استاندارد یافت میشود.
- Mersenne Twister (MT19937): این الگوریتم که در سال ۱۹۹۷ توسعه یافت، پرکاربردترین PRNG در زبانهای برنامهنویسی عمومی از جمله پایتون، روبی، PHP و R است. دوره تناوب آن ۲ ۱۹۹۳۷ -۱ است، تقریباً از تمام آزمونهای آماری عبور میکند و سریع است. با این حال، از نظر رمزنگاری ایمن نیست - دانستن ۶۲۴ خروجی متوالی برای بازسازی کل وضعیت داخلی آن و پیشبینی تمام خروجیهای آینده کافی است.
- Xorshift و Xoshiro/Xoroshiro: خانوادهای از PRNGهای سریع و مدرن مبتنی بر عملیات XOR و شیفت بیتی. Xoshiro256** و Xoroshiro128+ به دلیل سرعت، اندازه حالت کوچک و خواص آماری عالی در موتورهای بازی و محاسبات عددی محبوب هستند.
- PCG (مولد همنهشتی جایگشتی): خانواده جدیدتری که یک پایه همنهشتی خطی را با یک تابع خروجی جایگشتی ترکیب میکند. مولدهای PCG سریع، از نظر آماری عالی هستند و از چندین جریان مستقل پشتیبانی میکنند، که آنها را برای شبیهسازی موازی بسیار مناسب میکند.
مولدهای اعداد تصادفی واقعی (TRNG)
یک مولد اعداد تصادفی واقعی، خروجی خود را از یک فرآیند فیزیکی که واقعاً غیرقابل پیشبینی است، میگیرد - فرآیندی که توسط مکانیک کوانتومی، نویز حرارتی یا سایر منابع آنتروپی فیزیکی اداره میشود. از آنجا که منبع غیرقطعی است، دو اجرا با تنظیمات یکسان همچنان خروجیهای متفاوتی تولید میکنند. TRNGها را نمیتوان برای تولید یک دنباله به کار گرفت، که هم نقطه قوت آنهاست و هم در برخی زمینهها، یک محدودیت محسوب میشود.
منابع آنتروپی فیزیکی مورد استفاده در TRNGها عبارتند از:
- نویز حرارتی: حرکت تصادفی الکترونها در یک مقاومت، نوسانات ولتاژی ایجاد میکند که میتوان آنها را نمونهبرداری و دیجیتالی کرد. این یکی از رایجترین منابع آنتروپی سختافزاری است.
- واپاشی رادیواکتیو: زمان انتشار ذرات از یک نمونه رادیواکتیو اساساً کوانتومی-مکانیکی و غیرقابل پیشبینی است. شمارندههای گایگر متصل به رایانهها میتوانند این آنتروپی را برداشت کنند.
- اثرات کوانتومی فوتونی: دستگاههایی که فوتونها را تقسیم کرده و مسیر آنها را اندازهگیری میکنند، از برهمنهی کوانتومی برای تولید بیتهایی با تصادفی بودن قابل اثبات استفاده میکنند. مولدهای اعداد تصادفی کوانتومی تجاری (QRNG) اکنون در دسترس هستند.
- نویز جوی: سرویسهایی مانند RANDOM.ORG نویز فرکانس رادیویی را از جو نمونهبرداری میکنند، آن را دیجیتالی میکنند و اعداد حاصل را از طریق اینترنت ارائه میدهند. این یک TRNG است که به عنوان یک سرویس ارائه میشود.
- مخازن آنتروپی سیستم عامل: سیستم عاملهای مدرن، آنتروپی را از وقفههای سختافزاری، زمانبندی دیسک، زمان رسیدن بستههای شبکه و ورودی کاربر (ضربات کلید، حرکات ماوس) جمعآوری میکنند. در لینوکس، این مخزن از طریق
/dev/randomو/dev/urandomو در ویندوز، از طریق API CryptGenRandom در دسترس است.
مولدهای اعداد شبه تصادفی با امنیت رمزنگاری (CSPRNG)
دسته سوم، شکاف بین PRNGها و TRNGها را پر میکند. یک مولد اعداد شبهتصادفی امن از نظر رمزنگاری، یک PRNG است که از یک منبع آنتروپی واقعی ایجاد شده و به گونهای طراحی شده است که خروجی آن از نظر محاسباتی حتی توسط یک دشمن با منابع قابل توجه، از تصادفی بودن واقعی غیرقابل تشخیص باشد. دانستن هر بخشی از خروجی آن، امکان پیشبینی مقادیر گذشته یا آینده را فراهم نمیکند.
مثالها عبارتند از:
- ChaCha20: یک رمز جریانی که به عنوان CSPRNG در سیستم عاملهای مدرن و کتابخانههای رمزنگاری، از جمله
/dev/urandomلینوکس از هسته ۴.۸ به بعد، استفاده میشود. - فورتونا: یک طراحی CSPRNG توسط بروس اشنایر و نیلز فرگوسن که به طور مداوم خود را از منابع آنتروپی متعدد بازتولید میکند و آن را در برابر حملات نفوذ به وضعیت مقاوم میسازد.
- HMAC-DRBG و CTR-DRBG: مولدهای بیت تصادفی قطعی استاندارد شده توسط NIST (SP 800-90A)، که به طور گسترده در کتابخانههای رمزنگاری و ماژولهای امنیتی سختافزاری استفاده میشوند.
نحوه کار یک مولد عدد: گام به گام
اگرچه پیادهسازیها متفاوت هستند، اما اکثر مولدهای عدد از یک الگوی عملیاتی مشترک پیروی میکنند.
- مقداردهی اولیه: مولد، وضعیت داخلی خود را تعیین میکند. برای یک PRNG، این به معنای پذیرش یک مقدار اولیه است - که اغلب زمان فعلی سیستم، یک عدد صحیح ارائه شده توسط کاربر یا بایتهایی از یک منبع آنتروپی است. برای یک TRNG، این مرحله شامل فعالسازی سختافزار اندازهگیری فیزیکی است.
- تبدیل حالت: مولد، تابع ریاضی اصلی خود را بر حالت فعلی اعمال میکند و حالت جدیدی تولید میکند. در Mersenne Twister، این شامل یک عملیات پیچش روی یک آرایه ۶۲۴ عنصری از اعداد صحیح ۳۲ بیتی است. در یک مولد خطی همنهشت، این عملیات شامل یک عملیات ضرب، جمع و مدول است.
- استخراج خروجی: بخشی از حالت جدید - یا تابعی از آن - استخراج شده و به عنوان عدد خروجی بازگردانده میشود. این مرحله اغلب شامل اختلاط یا تعدیل اضافی برای بهبود خواص آماری است.
- نگاشت محدوده: خروجی خام، که معمولاً یک عدد صحیح بزرگ یا دنبالهای از بیتها است، به محدوده مورد نظر نگاشت میشود. برای عددی بین ۱ تا ۱۰۰، خروجی خام با استفاده از تقسیم یا حساب مدول مقیاسبندی میشود. در اینجا باید دقت شود: کاهش مدول ساده، زمانی که محدوده خروجی به طور مساوی به فضای خروجی مولد تقسیم نمیشود، بایاس ایجاد میکند.
- تکرار: مراحل ۲ تا ۴ برای هر عدد درخواستی بعدی تکرار میشوند. حالت به تکامل خود ادامه میدهد و مقدار بعدی را در دنباله تولید میکند.
ویژگیهای کلیدی که کیفیت ژنراتور را تعریف میکنند
همه مولدهای عدد با هم برابر نیستند. از ویژگیهای زیر برای ارزیابی و مقایسه آنها استفاده میشود.
| ملک | معنی آن چیست؟ | چرا مهم است؟ |
|---|---|---|
| دوره | طول دنباله قبل از تکرار آن | دورههای کوتاه باعث تکرار در شبیهسازیهای طولانی میشوند و همبستگی را معرفی میکنند. |
| یکنواختی | هر مقدار خروجی ممکن با فراوانی یکسانی در درازمدت ظاهر میشود | بایاسهای خروجی غیر یکنواخت در نمونهبرداری، بازیها و شبیهسازیها |
| استقلال | دانستن خروجیهای قبلی هیچ اطلاعاتی در مورد خروجیهای آینده نمیدهد. | خروجیهای همبسته، آزمونهای آماری را بیاعتبار میکنند و حملات پیشبینی را ممکن میسازند. |
| غیرقابل پیشبینی بودن | یک ناظر نمیتواند مقادیر آینده را از خروجی گذشته تعیین کند | برای کاربردهای رمزنگاری ضروری است؛ برای شبیهسازیهای تکرارپذیر بیربط است |
| تکرارپذیری | همان بذر همیشه همان توالی را تولید میکند | برای اشکالزدایی، تکرارپذیری علمی و تولید رویه مورد نیاز است |
| سرعت | ژنراتور با چه سرعتی خروجی تولید میکند | شبیهسازیهای با توان عملیاتی بالا ممکن است به میلیاردها عدد در ثانیه نیاز داشته باشند |
| اندازه ایالت | وضعیت داخلی چه مقدار از حافظه را اشغال میکند | بر مناسب بودن برای سیستمهای تعبیهشده و اجرای موازی تأثیر میگذارد |
آزمون آماری مولدهای عدد
از آنجا که شبهتصادفی بودن یک ویژگی آماری است و نه یک تضمین ریاضی، مولدها با استفاده از مجموعههای آزمون استاندارد که الگوهای قابل تشخیص را بررسی میکنند، ارزیابی میشوند.
- مجموعه آزمونهای آماری NIST (SP 800-22): پانزده آزمون که شامل فرکانس، فرکانس بلوک، اجراها، طولانیترین اجراها، رتبه ماتریس دودویی، طیفی (DFT)، الگوهای همپوشانی، آمار جهانی، پیچیدگی خطی، سریال، آنتروپی تقریبی، مجموع تجمعی، گشتهای تصادفی و انواع گشتهای تصادفی میشود. برای صدور گواهینامه رمزنگاری الزامی است.
- آزمونهای سرسخت: توسط جورج مارساگلیا توسعه داده شد، مجموعهای از آزمونها شامل آزمون فاصلههای تولد، جایگشتهای همپوشانی و آزمون فشار. از نظر تاریخی تأثیرگذار؛ اکنون تا حد زیادی جایگزین شدهاند.
- TestU01: یک کتابخانه جامع C که در دانشگاه مونترال توسعه داده شده و شامل سه باتری اصلی - SmallCrush، Crush و BigCrush - است که BigCrush از همه سختتر است. Mersenne Twister در چندین آزمایش BigCrush شکست میخورد؛ Xoshiro256** و PCG از همه آنها سربلند بیرون میآیند.
- PractRand: یک مجموعه تست مدرن که قادر به پردازش توالیهای بسیار طولانی (ترابایتها خروجی) برای تشخیص همبستگیهای ظریف و دوربردی است که تستهای کوتاهتر از دست میدهند.
مولدی که تمام آزمایشها را در یک مجموعه داده شده با موفقیت پشت سر میگذارد، تصادفی بودنش ثابت نشده است - ثابت شده است که فاقد الگوهای خاصی است که آزمایشها به دنبال آن هستند. این تمایز اساسی است: آزمایش آماری شواهدی از کیفیت ارائه میدهد، نه اثبات ریاضی غیرقابل پیشبینی بودن.
نحوه استفاده موثر از یک مولد عدد: استراتژی و تاکتیکهای عملی
برای استفاده مؤثر از یک مولد عدد، قبل از تولید، محدوده و کمیت خود را تعریف کنید، نوع مولد مناسب را برای مورد استفاده خود انتخاب کنید (تصادفی واقعی در مقابل شبهتصادفی)، و تأیید کنید که ابزار با الزامات آماری وظیفه شما مطابقت دارد. بیشتر خطاها از تنظیمات نامتناسب، خروجیهای تکراری در هنگام نیاز به منحصر به فرد بودن و استفاده از یک مولد با کیفیت پایین برای کارهای حساس به امنیت ناشی میشوند.
استراتژی گام به گام برای رسیدن به نتایج مناسب
مرحله ۱: محدوده و پارامترهای خود را تعریف کنید
قبل از لمس هر ابزاری، دقیقاً آنچه را که نیاز دارید بنویسید. ورودیهای مبهم، خروجیهای بیفایده تولید میکنند. موارد زیر را مشخص کنید:
- حداقل مقدار: کمترین عددی که در خروجی شما قابل قبول است (مثلاً ۱، ۰ یا یک عدد منفی)
- حداکثر مقدار: بالاترین تعداد مجاز (مثلاً ۱۰۰، ۱۰۰۰ یا سقف دلخواه)
- تعداد: در یک قرعهکشی به چند عدد نیاز دارید
- الزام منحصر به فرد بودن: آیا تکرار اعداد مجاز است یا هر عدد باید فقط یک بار ظاهر شود؟
- نوع عدد: فقط اعداد صحیح، یا اعداد اعشاری با تعداد مشخصی از ارقام اعشار
- ترتیب: اینکه آیا خروجی باید مرتبسازی، ترکیب یا به ترتیب تولید خام باقی بماند.
نادیده گرفتن این مرحله، شایعترین علت اتلاف وقت است. کسی که قرعهکشی را اجرا میکند و فراموش میکند کارتهای تکراری را غیرفعال کند، ممکن است دو بار همان شماره بلیط را قرعهکشی کند و مجبور شود از اول شروع کند.
مرحله ۲: ژنراتور مناسب برای هدف خود را انتخاب کنید
همه مولدهای عدد معادل نیستند. جدول زیر موارد استفاده رایج را به نوع مولد مناسب نگاشت میکند.
| مورد استفاده | نوع ژنراتور توصیه شده | الزامات کلیدی |
|---|---|---|
| قرعهکشی، قرعهکشی، اهدای جوایز | نویز تصادفی واقعی (مبتنی بر سختافزار یا نویز اتمسفری) | قابل تأیید عمومی، بیطرفانه |
| نمونهگیری آماری، تحقیق | PRNG رمزنگاریشده امن یا تصادفی واقعی | توزیع یکنواخت، تکرارپذیری اختیاری |
| کلیدهای رمزنگاری، رمزهای عبور، توکنها | PRNG رمزنگاریشده امن (CSPRNG) | غیرقابل پیشبینی بودن، ناشی از آنتروپی |
| مکانیک بازی، شبیهسازیها | استاندارد PRNG (Mersenne Twister، xoshiro) | سرعت، تکرارپذیری با یک دانه |
| تدریس، فعالیتهای کلاسی | هر PRNG ساده یا ابزار آنلاین | سهولت استفاده، جذابیت بصری |
| تست A/B، تخصیص تصادفی | PRNG با یک بذر ثابت برای تکرارپذیری | قابلیت حسابرسی، تکرارهای مداوم |
| کدهای پین، شمارههای تأیید | سیاسپیآرانجی | بدون الگوهای قابل پیشبینی |
مرحله 3: ابزار را به درستی پیکربندی کنید
ژنراتور انتخابی خود را باز کنید و قبل از کلیک روی تولید، هر پارامتر موجود را تنظیم کنید. به تنظیمات پیشفرض تکیه نکنید، مگر اینکه تأیید کنید که با نیازهای شما مطابقت دارند. فیلدهای پیکربندی رایج عبارتند از:
- فیلدهای محدوده: حداقل و حداکثر خود را صریحاً وارد کنید، حتی اگر پیشفرض درست به نظر برسد
- فیلد شمارش: تعداد دقیق خروجیهای مورد نیاز را تنظیم کنید.
- ضامن منحصر به فرد/بدون تکرار: این را برای قرعهکشیهایی که هر عدد فقط یک بار میتواند ظاهر شود، فعال کنید.
- گزینههای قالببندی: انتخاب کنید که آیا نتایج به صورت لیست، جدا شده با کاما یا در یک جدول نمایش داده شوند
- ورودی Seed (پیشرفته): برای نتایج تکرارپذیر در تحقیق یا آزمایش، یک مقدار Seed ثابت وارد کنید و آن را ثبت کنید
مرحله ۴: تولید و اعتبارسنجی خروجی
پس از تولید، بلافاصله از خروجی استفاده نکنید. یک مرحله اعتبارسنجی سریع اجرا کنید:
- تأیید کنید که همه اعداد در محدوده مشخص شده شما قرار دارند
- اگر منحصر به فرد بودن مورد نیاز بود، موارد تکراری را بررسی کنید
- تأیید کنید که تعداد با آنچه درخواست کردهاید مطابقت دارد
- برای استفاده تحقیقاتی، یک بررسی فرکانس اولیه را در چندین دسته انجام دهید تا ناهنجاریهای توزیع را مشخص کنید.
- برای اهداف امنیتی، هرگز خروجی خام را در یک محیط ناامن نمایش ندهید یا ثبت نکنید.
مرحله ۵: نتایج را ثبت و مستند کنید
برای هرگونه استفاده رسمی - مسابقات، تحقیقات، ممیزیها - رویداد تولید را مستند کنید. ابزار مورد استفاده، URL یا نسخه نرمافزار، تاریخ و زمان، پارامترهای وارد شده و خود خروجی را ثبت کنید. این یک مسیر ممیزی ایجاد میکند که میتواند در برابر اختلافات از شما دفاع کند. برخی از سرویسهای آنلاین، مانند RANDOM.ORG، برای هر رویداد تولید، به طور خاص برای این منظور، یک گواهی یا مهر زمانی صادر میکنند.
تاکتیکهای عملی برای سناریوهای خاص
اجرای یک قرعهکشی یا بختآزمایی منصفانه
- قبل از تولید، به همه شرکتکنندگان شمارههای متوالی اختصاص دهید (۱ تا N، که N تعداد کل شرکتکنندگان است)
- از یک مولد تصادفی واقعی استفاده کنید، نه یک PRNG، تا نتیجه از یک سید قابل مهندسی معکوس نباشد.
- برای جلوگیری از اختلافات، در مقابل شاهدان تولید کنید یا صفحه را ضبط کنید
- اگر چندین برنده دارید، گزینه عدم تکرار را فعال کنید تا یک نفر نتواند دو بار برنده شود.
- مجموعه کامل پارامترها را در کنار نتیجه منتشر کنید تا همه بتوانند عادلانه بودن قرعهکشی را تأیید کنند.
تولید اعداد برای تحقیقات آماری
- از قبل تصمیم بگیرید که آیا به توزیع یکنواخت، نرمال یا توزیع دیگری نیاز دارید - اکثر مولدهای پیشفرض فقط توزیعهای یکنواخت تولید میکنند
- وقتی به نتایج تکرارپذیر در چندین اجرای یک آزمایش نیاز دارید، از یک منبع ثابت استفاده کنید.
- یک نمونه بزرگتر از حد مورد نیاز ایجاد کنید، سپس به جای دوباره کاری، مقادیر خارج از محدوده هدف خود را حذف کنید تا از ایجاد سوگیری جلوگیری شود.
- اگر کیفیت تصادفی بودن برای نتیجهگیریهای شما مهم است، نمونه خود را با آزمون نیکویی برازش کای دو یا آزمون کولموگروف-اسمیرنوف بیازمایید.
ایجاد توکنها و کدهای امن
- همیشه از CSPRNG استفاده کنید. در پایتون، از secrets.randbelow() یا secrets.token_hex() استفاده کنید. در جاوا اسکریپت، از crypto.getRandomValues() استفاده کنید. هرگز از Math.random() برای اهداف امنیتی استفاده نکنید.
- توکنهایی با آنتروپی کافی برای مدل تهدید خود تولید کنید - یک پین عددی ۶ رقمی فقط حدود ۲۰ بیت آنتروپی دارد که برای هر چیزی فراتر از تأیید کمخطر ضعیف است.
- از تولید کدهایی که شبیه به هم هستند (مثلاً 000001، 000002) خودداری کنید - برای جلوگیری از حملات شمارشی از طیف وسیعی استفاده کنید.
- توکنهای تولید شده را به صورت هش شده ذخیره کنید، نه به صورت متن ساده
استفاده از مولدهای اعداد در بازیها و شبیهسازیها
- یک الگوریتم PRNG متناسب با سرعت و طول دوره انتخاب کنید - Mersenne Twister دارای دوره 2 19937 −1 است که آن را برای شبیهسازیهای طولانی مناسب میکند.
- PRNG خود را از یک منبع با آنتروپی بالا (کلاک سیستم همراه با نویز سختافزاری) استخراج کنید تا از توالیهای یکسان در اجراهای مکرر جلوگیری شود.
- برای عدالت در بازی چند نفره، اعداد را در سمت سرور تولید کنید و فقط پس از اینکه همه بازیکنان حرکات خود را انجام دادند، آنها را آشکار کنید (یک طرح انجام-آشکارسازی)
- ثبت اطلاعات استفاده شده در تست بازی، بنابراین میتوانید حالتهای دقیق بازی را برای اشکالزدایی بازتولید کنید.