ماژول random در پایتون
ماژول random در پایتون
ماژول استاندارد random در پایتون
در علوم مهندسی، پردازش داده و شبیهسازی، علاوه بر تولید اعداد تصادفی یکنواخت، نیاز به تولید نویزهای واقعی و توزیعهای آماری داریم. پایتون ماژول استاندارد و توکار random را برای تمامی این نیازها فراهم کرده است.
مفهوم ماژول random
ماژول random جزو کتابخانه استاندارد پایتون (Python Standard Library) است و نیازی به نصب ندارد؛ فقط با دستور import random وارد برنامه میشود.
نکته تئوری: این ماژول بر پایه الگوریتم شبهتصادفی Mersenne Twister کار میکند. با تابع
random.seed()میتوانیم «هسته تصادفی» را ثابت نگه داریم تا نتایج در تمام دفعات اجرا کاملاً یکسان و تکرارپذیر باشند (بسیار مهم در تحقیقات و تست کد).
توابع (متدهای) پرکاربرد ماژول random
معرفی متدهای ماژول random همراه با توضیحات، مثالها و خروجی نمونه به شرح زیر است:
۱. random.randint(a, b)
- توضیح: یک عدد صحیح تصادفی در بازه بسته [a, b] تولید میکند (خود a و b هم ممکن است انتخاب شوند).
import random
roll = random.randint(1, 6)
print(roll) # خروجی نمونه: 4
۲. random.randrange(start, stop, step)
- توضیح: یک عدد صحیح تصادفی از دنباله
range(start, stop, step)انتخاب میکند. نقطه پایان (stop) در نظر گرفته نمیشود.
import random
odd_num = random.randrange(1, 10, 2)
print(odd_num) # خروجی نمونه: 7
۳. random.random()
- توضیح: یک عدد اعشاری تصادفی با توزیع یکنواخت در بازه نیمهباز [0.0, 1.0) تولید میکند.
import random
val = random.random()
print(round(val, 4)) # خروجی نمونه: 0.6354
۴. random.uniform(a, b)
- توضیح: یک عدد اعشاری با توزیع یکنواخت در بازه دلخواه [a, b] برمیگرداند.
import random
temp = random.uniform(36.5, 37.5)
print(round(temp, 2)) # خروجی نمونه: 36.82
۵. random.gauss(mu, sigma)
- توضیح: تولید عدد تصادفی با توزیع نرمال (گوسی) با میانگین
mu() و انحراف معیارsigma()؛ ایدهآل برای شبیهسازی نویز محیطی و پدیدههای طبیعی.
import random
noise = random.gauss(0, 1)
print(round(noise, 3)) # خروجی نمونه: -0.428
۶. random.choice(seq)
- توضیح: یک عضو تصادفی را از یک دنباله (مثل لیست یا تاپل) انتخاب میکند.
import random
colors = ["red", "blue", "green"]
selected = random.choice(colors)
print(selected) # خروجی نمونه: 'blue'
۷. random.choices(seq, weights=None, k=1)
- توضیح: تعداد k عضو را با امکان تکرار مجدد انتخاب میکند. میتوان با پارامتر
weightsبرای هر عضو شانس انتخاب متفاوتی تعریف کرد.
import random
items = ["win", "lose"]
results = random.choices(items, weights=[10, 90], k=3)
print(results) # خروجی نمونه: ['lose', 'lose', 'win']
۸. random.sample(seq, k)
- توضیح: تعداد k عضو تصادفی یکتا (بدون تکرار) از دنباله انتخاب میکند.
import random
lottery = list(range(1, 20))
winning_numbers = random.sample(lottery, 3)
print(winning_numbers) # خروجی نمونه: [14, 3, 9]
۹. random.shuffle(list)
- توضیح: ترتیب عناصر یک لیست را به صورت درجا (In-place) بههم میریزد و مقداری برنمیگرداند (
None).
import random
deck = [1, 2, 3, 4, 5]
random.shuffle(deck)
print(deck) # خروجی نمونه: [3, 1, 5, 2, 4]
۱۰. random.seed(x)
- توضیح: مقداردهی اولیه هسته الگوریتم تولید تصادفی را انجام میدهد تا در دفعات بعدی اجرای کد، دقیقاً همان خروجیهای قبلی بازتولید شوند.
import random
random.seed(42)
print(random.randint(1, 100)) # خروجی قطعی و ثابت: 82
مثالهای کاربردی
مثال اول: تولید نویز تصادفی با توزیع گوسی (gauss)
- صورت مسئله: میخواهیم نویز حرارتی سنسور را که از توزیع نرمال پیروی میکند با میانگین 0 و انحراف معیار 0.15شبیهسازی کرده و به سیگنال اضافه کنیم.
import random
base_signal = 1.25 # ولتاژ پایه سیگنال
# تولید نویز گوسی با میانگین ۰ و انحراف معیار ۰.۱۵
gaussian_noise = random.gauss(0.0, 0.15)
noisy_signal = base_signal + gaussian_noise
print(f"نویز گوسی: {round(gaussian_noise, 4)}")
print(f"سیگنال نهایی با نویز: {round(noisy_signal, 4)}")
مثال دوم: تولید مقادیر با گام مشخص با randrange
- صورت مسئله: میخواهیم یک بازه زمانی تصادفی بر حسب میلیثانیه بین ۱۰۰ تا ۵۰۰ تولید کنیم، اما فقط مقادیری که مضرب ۵۰ هستند مجاز باشند.
import random
# تولید عدد تصادفی با شروع ۱۰۰، پایان ۵۰۰ و گام ۵۰
interval_ms = random.randrange(100, 550, 50)
print(f"بازه زمانی انتخابشده: {interval_ms} میلیثانیه")
مثال سوم: نمونهبرداری وزندار با choices
- صورت مسئله: در شبیهسازی وقوع ضربانهای قلب، احتمال ضربان نرمال ۸۰٪ و آریتمی ۲۰٪ است. میخواهیم وضعیتی را بر اساس این احتمال تولید کنیم.
import random
classes = ["Normal", "Arrhythmia"]
weights = [0.8, 0.2]
selected_class = random.choices(classes, weights=weights, k=1)[0]
print(f"وضعیت ثبتشده بر اساس توزیع وزندار: {selected_class}")
صورت مسئله
میخواهیم یک خط لوله (Pipeline) کامل آزمایشی بنویسیم که:
- ابتدا با
seedتکرارپذیری نتایج را تضمین کند. - ۵ نمونه نویز گوسی برای یک سیگنال تولید و میانگین نویز را گزارش کند.
- با
sample، تعدادی کانال سنسور را بدون تکرار انتخاب و باshuffleترتیب خواندن آنها را تصادفی کند.
import random
def run_advanced_random_pipeline():
"""
اجرای جامع پایپلاین ماژول random شامل توزیع گوسی، seed، sample و shuffle
"""
# ۱. تثبیت تصادفی بودن جهت تکرارپذیری نتایج
random.seed(42)
print("=== مقدار seed روی 42 تنظیم شد ===")
# ۲. شبیهسازی نویز گوسی (توزیع نرمال)
mu, sigma = 0.0, 0.2
noise_samples = [random.gauss(mu, sigma) for _ in range(5)]
print("\n۵ نمونه نویز گوسی تولید شده:")
for i, noise in enumerate(noise_samples, 1):
print(f" نمونه {i}: {round(noise, 4)}")
# ۳. انتخاب نمونه بدون تکرار با sample
sensors = [f"Sensor_{ch}" for ch in ["V1", "V2", "V3", "V4", "V5", "V6", "LeadI", "LeadII"]]
selected_sensors = random.sample(sensors, k=3)
print(f"\nکانالهای سنسور انتخابشده (sample): {selected_sensors}")
# ۴. بر هم زدن ترتیب با shuffle
execution_queue = selected_sensors.copy()
random.shuffle(execution_queue)
print(f"ترتیب تصادفی پردازش کانالها (shuffle): {execution_queue}")
# ۵. تولید عدد تصادفی گامدار با randrange
baud_rate = random.randrange(9600, 115200 + 1, 9600)
print(f"\nنرخ ارسال داده انتخابی (randrange): {baud_rate} bps")
if __name__ == "__main__":
run_advanced_random_pipeline()
نتیجهگیری
ماژول random ابزاری کامل در کتابخانه استاندارد پایتون است که نهتنها انتخابها و اعداد یکنواخت (randint, uniform) را مدیریت میکند، بلکه با توابعی مثل gauss و choices امکان شبیهسازی سیستمهای تصادفی واقعی، نویزهای آماری و نمونهبرداریهای وزندار را فراهم میسازد.
