ویژگی تصویر

کتابخانه random در پایتون: راهنمای کامل و کاربردی

  /  پایتون   /  کتابخانه 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 و تفاوت با منابع امن سیستم به شما کمک می‌کند انتخاب مناسبی داشته باشید و از خطاهای رایج جلوگیری کنید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: