کتابخانه random در پایتون
ماژول random در پایتون ابزاری استاندارد برای تولید و کار با اعداد و انتخابهای تصادفی فراهم میکند. این ماژول برای شبیهسازی، تست، الگوریتمهای تصادفی، بازیها و نمونهبرداری آماری بسیار مفید است. در این مقاله مفاهیم پایه، توابع مهم، نکات تخصصی و بهترین روشهای استفاده از ماژول random را بررسی میکنیم.
مفاهیم پایه و توابع پرکاربرد
توابع پایه شامل تولید عدد اعشاری در بازه [0.0, 1.0)، اعداد صحیح، اعداد اعشاری در بازه دلخواه و نمونهگیری از توالیها هستند. مهمترین توابع:
random.random()— عدد اعشاری در [0.0, 1.0).random.randint(a, b)— عدد صحیح در بازه شامل a تا b.random.randrange(start, stop, step)— مشابه range برای تولید عدد صحیح تصادفی.random.uniform(a, b)— عدد اعشاری یکنواخت در [a, b].
import random
print(random.random()) # نمونهای از 0.0 تا 1.0
print(random.randint(1, 10)) # عدد صحیح بین 1 و 10
print(random.uniform(5, 7)) # عدد اعشاری بین 5 و 7توضیح: این کد سه نمونه متفاوت تولید میکند: یک اعشاری یکنواخت در [0,1)، یک عدد صحیح بین 1 تا 10 و یک اعشاری بین 5 تا 7. این توابع برای نیازهای ساده و روزمره مناسباند.
انتخاب و نمونهبرداری از لیستها
برای کار با توالیها توابع زیر کاربردی هستند:
choice(seq)— انتخاب تصادفی یک عنصر.choices(population, weights=None, k=1)— انتخاب با امکان وزندهی و تکرار.sample(population, k)— نمونهبرداری بدون جایگزینی.shuffle(x)— درهمریختن (shuffling) لیست بهصورت in-place.
import random
items = ['a', 'b', 'c', 'd']
print(random.choice(items)) # یک عنصر
print(random.choices(items, weights=[1,2,3,4], k=3)) # با وزن
print(random.sample(items, 2)) # دو عنصر غیرتکراری
random.shuffle(items)
print(items) # لیست درهمشدهتوضیح: مثال نشان میدهد چگونه از choice و sample برای انتخابهای مختلف استفاده میشود. choices با پارامتر weights امکان توزیع نامتعادل را میدهد و shuffle لیست را تغییر میدهد.
توزیعهای تصادفی (تصادفیسازی پیشرفته)
ماژول random توابع مختلفی برای تولید اعداد از توزیعهای احتمالاتی رایج ارائه میدهد که برای شبیهسازی و مدلسازی بسیار مهماند:
random.gauss(mu, sigma)وrandom.normalvariate(mu, sigma)— توزیع نرمال (گوسی).random.expovariate(lambd)— توزیع نمایی (برای فواصل زمانی Poisson).random.betavariate(alpha, beta)— بتا برای متغیرهای در بازه [0,1].random.triangular(low, high, mode)— توزیع مثلثی.
import random
# تولید نمونه از توزیع نرمال و نمایی
data = [random.gauss(0, 1) for _ in range(1000)]
intervals = [random.expovariate(0.5) for _ in range(1000)]
print(sum(data)/len(data)) # میانگین تقریبی نزدیک به 0توضیح: در مثال بالا از توزیع گوسی برای تولید 1000 نمونه و محاسبه میانگین استفاده شده. از توزیع نمایی برای شبیهسازی فواصل زمانی میتوان بهره برد. انتخاب توزیع مناسب به مسئله و خواص دادهها بستگی دارد.
تعیین بذر (seed) و تولید قابل بازتولید
برای بازتولید نتایج آزمایشها و تستها، تعیین بذر اهمیت دارد. با استفاده از random.seed() میتوان روند تولید اعداد تصادفی را بازتولیدپذیر کرد. علاوه بر این میتوان نمونههای مستقل با random.Random() ساخت.
import random
random.seed(42)
print([random.randint(1, 10) for _ in range(5)])
r = random.Random(123) # مولد مستقل
print([r.random() for _ in range(3)])توضیح: با random.seed(42) هر بار اجرای برنامه اعداد یکسان تولید میشوند که برای تست بسیار مفید است. با استفاده از نمونه Random() میتوان مولدهای مستقل و چندگانه ساخت تا از تداخل حالت حالت جهانی جلوگیری شود.
امنیت، SystemRandom و تفاوت با secrets
random برای کاربردهای عمومی مناسب است اما برای موارد رمزنگاری یا تولید کلید امن نیست. کلاس random.SystemRandom از منابع تصادفی سیستمعامل استفاده میکند و امنیت بیشتری دارد، اما برای رمزنگاری توصیه رسمی پایتون ماژول secrets است.
import random, secrets
sr = random.SystemRandom()
print(sr.randint(1, 100)) # استفاده از منبع تصادفی سیستم
print(secrets.token_hex(16)) # تولید توکن امنتوضیح: SystemRandom در مواقعی که به منبع تصادفی سیستم نیاز است مفید است؛ برای تولید توکنها و رمزنگاری از secrets استفاده کنید چون طراحی شده برای امنیت رمزنگاری.
جدول مقایسه توابع متداول
| تابع | کاربرد | نوع خروجی |
|---|---|---|
| random() | اعداد اعشاری یکنواخت در [0,1) | float |
| randint(a,b) | اعداد صحیح در بازه شامل | int |
| choice / choices / sample | انتخاب از توالیها (با/بدون وزن) | عنصر یا لیست |
| gauss / expovariate / betavariate | نمونهبرداری از توزیعها | float |
نکات پیشرفته و بهترین شیوهها
- برای محاسبات حجیم و ماتریسی از numpy.random استفاده کنید که کارایی و توزیع مناسبتری برای دادههای بزرگ دارد.
- برای موازیسازی و جلوگیری از همپوشانی توزیعها، برای هر thread یا فرایند از نمونههای
Random()مجزا استفاده کنید. - اگر نیاز به امنیت رمزنگاری دارید حتماً از ماژول
secretsیاSystemRandomاستفاده کنید. - برای آزمایشهای تکرارپذیر مقدار seed را مشخص کنید و در مستندات آزمایش بنویسید که کدام seed استفاده شده است.
ماژول random ابزار ساده و قدرتمندی برای بسیاری از کاربردهاست؛ شناخت توابع، رفتار seed و تفاوت با منابع امن سیستم به شما کمک میکند انتخاب مناسبی داشته باشید و از خطاهای رایج جلوگیری کنید.
آیا این مطلب برای شما مفید بود ؟




