سطح مقدماتی (Beginner Level)
تولید اعداد یا دادههای تصادفی یکی از نیازهای اصلی در برنامهنویسی است، از ساخت بازیها گرفته تا شبیهسازیهای آماری. پایتون ماژول استاندارد random را برای این کار ارائه میدهد.
۱. تولید اعداد تصادفی پایه (Basic Random Numbers)
سادهترین تابع در این ماژول، تابع random() است که یک عدد اعشاری بین ۰ و ۱ تولید میکند. برای اعداد صحیح نیز از randint() استفاده میشود.
مثال ۱: تولید یک عدد اعشاری ساده این کد یک عدد اعشاری تصادفی (float) بین 0.0 تا 1.0 برمیگرداند.
مثال ۲: تولید عدد صحیح در یک بازه مشخص
تابع randint(a, b) یک عدد صحیح تصادفی برمیگرداند که شامل خود a و b نیز میشود.
مثال ۳: عدد اعشاری در بازه دلخواه
اگر عددی اعشاری در بازهای غیر از ۰ تا ۱ بخواهید، از uniform() استفاده کنید.
۲. انتخاب تصادفی از لیست (Random Selection)
اغلب نیاز داریم یک آیتم را بهصورت تصادفی از یک لیست یا رشته انتخاب کنیم. تابع choice() برای انتخاب یک آیتم و choices() برای انتخاب چند آیتم (با جایگذاری) استفاده میشود.
مثال ۱: انتخاب یک برنده
مثال ۲: انتخاب چند آیتم (ممکن است تکراری باشند)
تابع choices اجازه میدهد چندین آیتم انتخاب کنید. در اینجا ممکن است یک رنگ چند بار انتخاب شود.
۳. بر هم زدن لیست (Shuffling)
برای تغییر ترتیب آیتمهای یک لیست (مانند بر زدن کارتها) از shuffle() استفاده میشود. این تابع لیست اصلی را تغییر میدهد (In-place).
مثال ۱: بر زدن یک لیست اعداد
مثال ۲: کارتهای بازی
# این تابع لیست ورودی را تغییر میدهد و خروجی برنمیگرداند
def deck_shuffler(deck):
random.shuffle(deck)
return deck
سطح پیشرفته (Professional Level)
در سطح حرفهای، بحث کنترل تکرارپذیری (Seeding)، نمونهبرداری بدون جایگذاری، و امنیت اعداد تصادفی (Cryptography) مطرح میشود.
۱. دانه تصادفی (Seed) و تکرارپذیری
کامپیوترها نمیتوانند اعداد "کاملاً" تصادفی تولید کنند (Pseudo-random). اگر به random یک نقطه شروع (Seed) بدهید، همیشه همان دنباله اعداد را تولید میکند. این برای دیباگ کردن یا تستهای علمی حیاتی است.
مثال ۱: تولید نتایج یکسان با Seed ثابت
مثال ۲: استفاده در توابع تست
import random
def get_deterministic_id():
# همیشه یک ID ثابت تولید میکند چون seed ست شده است
random.seed(100)
return random.randint(1000, 9999)
۲. نمونهبرداری بدون تکرار (Sampling)
تفاوت choices() و sample() در این است که sample() آیتمهای تکراری برنمیگرداند (بدون جایگذاری). این برای مواردی مثل قرعهکشی که یک نفر نباید دو بار برنده شود، الزامی است.
مثال ۱: انتخاب ۳ برنده منحصر به فرد اگر لیست ۴ نفر باشد و ۳ نفر بخواهیم، هیچ نامی تکرار نمیشود.
مثال ۲: خطای منطقی در سایز نمونه
اگر تعداد درخواستی (k) از طول لیست بیشتر باشد، sample خطا میدهد (چون تکرار مجاز نیست)، اما choices خطا نمیدهد.
۳. امنیت در اعداد تصادفی (ماژول Secrets)
ماژول random برای کاربردهای امنیتی (مثل تولید پسورد یا توکن) امن نیست زیرا قابل پیشبینی است. برای این موارد حتماً باید از ماژول secrets استفاده کنید که از نظر رمزنگاری ایمن (Cryptographically Strong) است.
مثال ۱: تولید توکن امن برای URL
مثال ۲: انتخاب امن یک آیتم
تابع choice در secrets مشابه random عمل میکند اما با امنیت بالا.
۴. توزیعهای آماری (Distributions)
برای کارهای علمی و دادهکاوی، همیشه توزیع یکنواخت (Uniform) مناسب نیست. پایتون توزیعهای گاوسی (نرمال)، نمایی و غیره را نیز پشتیبانی میکند.
مثال ۱: توزیع گاوسی (Normal Distribution) تولید دادههایی که میانگین (mu) و انحراف معیار (sigma) مشخصی دارند.