در حال بارگزاری

آموزش تولید عدد تصادفی (random) در پایتون (python)

شما اینجا هستید:
آموزش تولید عدد تصادفی (random) در پایتون (python)

آموزش تولید اعداد تصادفی در پایتون (Python)

در این مطلب، به طور بی‌نهایت کامل تولید عدد تصادفی (random) از توزیع‌ها و حالات مختلف در پایتون (Python) رو آموزش خواهیم داد! اگر احیاناً توزیعی دیگه‌ای پیدا کردید که میشد ازش توی پایتون عدد تصادفی تولید کرد! و یا حتی سوالی داشتید، در بخش نظرات این مطلب با ما در میون بذارید تا همواره مطلب رو بروز و ایده آل نگه داریم (ان شاء الله)…

جزوه پیش‌نیاز

خیلی از جاها میگیم که مثلاً یک عدد تصادفی می‌خوایم تولید کنیم از و مثلاً Exp(β=2) و مثلاً نه از توزیع Exp(λ=2) !! شاید در نگاه اول بگید که این یک اسم گذاری ساده است و بین این دو توزیع هیچ فرقی وجود نداره! اما واقعیت اینه که نه ما، بلکه خیلی‌های دیگه هم نمایی رو با دو فرم نمایش می‌دهند! و سوال اینجاست که ما داریم از کدومِ اینا عدد تصادفی تولید می‌کنیم!

یا مثلاً یه جایی میگیم از توزیع لاپلاس عدد تصادفی تولید می‌کنیم! ولی سوال اینجاست که اصلاً توزیع لاپلاس چیه که بخوایم ازش عدد تصادفی تولید کنیم؟!

برای همین، لطفاً جزوه زیر رو دانلود کنید تا به یک ادبیات مشترک در تمام این متن برسیم! جزوه‌ای که شدیداً برای آن و برای ان مطلب که دارید میخونید زحمت کشیده شده! پس لطفا حق بنده به عنوان مولف آن را رعایت کنید! واقعاً خیلی خیلی زیاد وقت گذاشتم!

در جزوه زیر، تمام توزیع‌های معروف و حتی نیمه معروف (مثل لاپلاس) آورده شده، شکل آن‌ها رسم شده، تابع چگالی، امید ریاضی و واریانس آن‌ها گفته شده و ….!

دانلود جزوه (حجم: 700 کیلوبایت) (تعداد صفحه: 9) (نوع جزوه: تایپ‌شده)

چند نکته کلی مهم و پیش‌نیاز

نکته 1: برای تولید عدد تصادفی در پایتون (python) هم میشه از خود پکیج های خودِ خودش استفاده کرد! و هم از پکیج‌های دیگه مثل NumPy! از اونجایی که امکانات پکیج NumPy خیلی بیشتره، نه ما، خیلی‌ها دیگه هم برای تولید عدد تصادفی از پکیج NumPy استفاده می‌کنن!

نکته 2: برای استفاده از پکیج NumPy باید ابتدا اون رو نصب کنید، برای آموزش نصب مراجعه کنید به مطلب زیر!:

آموزش نصب پکیج‌های مختلف در پایتون (python)

نکته 3: پس از اینکه NumPy رو نصب کردید، حالا باید به پایتون (Python) بگید که لطفاً برام NumPy رو بذار بیاد توووو! که ازش استفاده کنم!!! حالا اینو چجوری باید بگیم؟!

باید بگیم:

import numpy as np

یعنی پکیج numpy رو as (یعنی به عنوان) np وارد کن (import یعنی وارد کردن)! حالا این np یعنی چی؟ و چرا np؟ اسم دیگه نمی‌شد؟!

ببینید، برای اینکه در ادامه حوصله نداریم به صورت کامل بنویسیم numpy و می‌خوایم خلاصه کنیم! به پایتون (Python) می‌گیم که اگر همون numpy رو خلاصه میکنم به عنوان np که از این به بعد دیگه سه ساعت ننویسیم numpy!

حالا سوال پیش میاد که بجز np هم میشه چیز دیگه نوشت! بله میشه! هر چی دوست دارین! اصلاً میتونین اسم خودتون رو بذارین!!

تولید عدد تصادفی از توزیع‌های گسسته

تولید عدد تصادفی از توزیع دوجمله ای (Binomial) در پایتون (Python)

فرم کلّی:

np.random.binomial(n,p)

فرض کنید می‌خواهیم از یک توزیع دوجمله‌ای به صورت Bin(n=10,p=0.5) یک عدد تصادفی تولید کنیم! در این صورت داریم!:

import numpy as np
a=np.random.binomial(10,0.5)
print(a)

که مثلاً خروجی برابر خواهد بود با!:

5

تولید عدد تصادفی از توزیع برنولی (Bernoulli) در پایتون (Python)

فرم کلّی:

np.random.binomial(1,p)

فرض کنید می‌خواهیم از توزیع برنولی به صورت Ber(p=0.5) یک عدد تصادفی تولید کنیم!

اولاً میدانیم که اگر در توزیع دوجمله‌ای (Binomial) پارامتر n را برابر 1 قرار دهیم، به توزیع برنولی می‌رسیم! پس برای تولید عدد تصادفی از توزیع برنولی با پارامتر p=0.5 داریم!:

import numpy as np
a=np.random.binomial(1,0.5)
print(a)

که این بار فرض کنید خروجی زیر را می‌دهد!:

0

تولید عدد تصادفی از توزیع پواسون (Poisson) در پایتون (Python)

فرم کلّی:

np.random.poisson(lambda)

فرض کنید می‌خواهیم از توزیع پواسون به صورت P(λ=10) یک عدد تصادفی تولید کنیم! در این صورت می‌نویسیم:

import numpy as np
a=np.random.poisson(10)
print(a)

که مثلاً نتیجه آن می‌شود!:

12

تولید عدد تصادفی از توزیع هندسی (Geometric) در پایتون (Python)

فرم کلّی:

np.random.geometric(p)

اگر بخواهیم از توزیع هندسی به صورت Ge(p=0.5) یک عدد تصادفی تولید کنیم، باید کدی به صورت زیر بنویسیم!:

import numpy as np
a=np.random.geometric(0.5)
print(a)

که مثلاً خروجی آن عبارت است از:

2

تولید عدد تصادفی از توزیع دو جمله ای منفی (Negative Binomial) نوع شکست در پایتون (Python)

فرم کلّی:

np.random.negative_binomial(r,p)

اگر بنا باشد از یک توزیع دوجمله ای منفی نوع شکست به فرم NB_q(r=4,p=0.5) یک عدد تصادفی تولید کنیم! باید بنویسیم:

import numpy as np
y=np.random.negative_binomial(4,0.5)
print(y)

که مثلاً خروجی زیر را می‌دهد!:

2

تولید عدد تصادفی از توزیع دو جمله ای منفی (Negative Binomial) نوع آزمایش در پایتون (Python)

فرم کلّی: ندارد! باید توضحات رو کامل بخونید!

فرض کنید می‌خواهیم از یک توزیع دو جمله ای منفی نوع آزمایش که به فرم NB(r=4,p=0.5) است، یک عدد تصادفی تولید کنیم!

اولاً میدانیم که اگر تعداد موفقیت‌ها را با r، متغیر تصادفی تعداد آزمایش‌ها تا رسیدن به r اُمین موفقیت را با X و متغیر تصادفی تعداد شکست‌ها تا رسیدن به r اُمین موفقیت را با Y نمایش دهیم! داریم:

Y+r=X

تذکر: چون میدونم یه عده دوستان بهم گیر خواهند داد!!! بگم که از لحاظ علم احتمال، جمله‌ی بالا نادقیق است! به عنوان نمونه حتماً باید ذکر شود که آزمایش‌های مستقل برنولی! ولی خب چون اون وقت فهم جمله فوق سخت‌تر میشد، دیگه اینجوری که می‌بینید نوشتم! ولی تاکید میکنم که جمله فوق، در اصل و از منظر علم احتمال، نادقیق است!

که درواقع Yهمان متغیر تصادفی دوجمله‌ای منفی نوع شکست است! و X همان متغیر تصادفی دو جمله ای منفی نوع آزمایش! پس برای تولید یک عدد تصادفی از متغیر تصادفی دوجمله ای منفی نوع آزمایش به فرم NB(r=4,p=0.5) می‌نویسیم:

import numpy as np
r=4;p=0.5
y=np.random.negative_binomial(r,p)
x=y+r
print(x)

دلیل اینکه چرا پارامترها رو یک راست استفاده نکردم و جداگانه تعریف کردم و خلاصه به صورت فوق نوشتم، خوانایی و کمک به فهم بیشتر مطلب است.

و خروجی مثلاً برابر خواهد بود با!:

10

نکته: توزیع دوجمله‌ای منفی به توزیع پاسکال نیز معروف است!

تولید عدد تصادفی از توزیع فوق هندسی (Hyper Geometric) در پایتون (Python)

فرم کلّی:

np.random.hypergeometric(ngood,nbad,nsample)

اگر مدنظر داشته باشیم که از توزیع فوق هندسی به فرم HG(N,m,n) یک عدد تصادفی تولید کنیم! باید چند نکته را یادآوری کنیم!

نکته 1: واضح است در فرم مذکور: تعداد خوب‌ها (یا همان خاص‌ها) که پکیج numpy آن را با ngood نمایش می‌دهد! همان m خودمان است!

نکته 2: از آنجایی که کل محموله شامل N قطعه است! پس تعداد بدها (یا همان غیرخاص‌ها) که پکیج numpy آن را با nbad نمایش می‌دهد! همان N-m خودمان است!

و این را هم بدانید که فرم وارد کردن پارامترها در پکیج numpy برای توزیع فوق هندسی، با فرمی که در احتمال و آمار برای نمایش توزیع فوق هندسی مرسوم است، کمی تفاوت دارد! و numpy بجای اینکه توزیع فوق هندسی را به فرم

HG(N, m, n)

نمایش دهد! آن را به فرم

HG(ngood, nbad, nsample)

نمایش می‌دهد! که گفتم منظورش از ngood و nbad چیه! nsample هم که یعنی اندازه نمونه! که همون n خودمونه!

واقعا چرا؟!!! چرا به همون فرمی که معمولاً توی احتمال و آمار مرسومه اینا رو درست نمیکنن تا ما برای توضیحش اینقدر فلاکت نکشیم!!!

خلاصه! تصور کنید می‌خوایم از توزیع HG(N=100,m=80,n=10) یک عدد تصادفی تولید کنیم! پس میگیم!:

import numpy as np
N=100;m=80;n=10
a=np.random.hypergeometric(m,N-m,n)
print(a)

بازهم واضحه که دلیل اینکه مستقبماً عددها رو توی تابع نذاشتم و بجاش اومدم اون همه متغیر تعریف کردم، اینه که فهمش ساده تر بشه!

و نهایتاً خروجی مثلاً میشه:

6

تولید عدد تصادفی گسسته عدد صحیح بین a و b

فرم کلّی:

np.random.randint(a,b)

فرض کنید به عنوان نمونه می‌خوایم یک عدد تصادفی بین 1 تا 100 تولید کنیم! در این صورت می‌نویسیم!

import numpy as np
a=np.random.randint(1,101)
print(a)

فکر کنم میدونید چرا بجای 100 نوشتیم 101 ! بله درسته! همانطور که در خیلی از موارد دیگه (مثل تابع range و غیره) در دیدید، عدد آخر حساب نمیشه! پس اینجا که عدد صحیحه! یکی کمترش حساب میشه! یعنی اینجا عملاً از 1 تا 100، به هر حال یک عدد انتخاب میکنه به طور تصادفی و نشون میده!

مثلاً فرض کنید خروجی میشه!:

24

تولید عدد تصادفی از توزیع‌های پیوسته

تولید عدد تصادفی از توزیع یکنواخت (Uniform) در بازه a تا b در پایتون (Python)

فرم کلّی:

np.random.uniform(a,b)

تصور کنید میخواید یک عدد تصادفی تولید کنید! و عدد تصادفی تولید شده رو در متغیری به اسم b ذخیره کنید!

مثلاً فرض کنید میخواین یک عدد تصادفی پیوسته اعشاری در بازه 7 تا 14 تولید کنید که خود 7 رو حساب کنه ولی 14 رو حساب نکنه! یعنی تولید عدد تصادفی در بازه زیر:

[7,14)

در این صورت می‌نویسیم:

import numpy as np
a=np.random.uniform(7,14)
print(a)

که مثلاً ممکنه عدد تصادفی که خروجی میده، عبارت زیر باشه!:

12.934798328911073

تولید عددِ تصادفی از توزیع مثلثی (Triangular) در پایتون (Python)

فرم کلّی:

np.random.triangular(a,c,b)

برای تولید یک عدد تصادفی مانند N از توزیع مثلثی trian(a=-4,c=-2,b=6) به طوریکه a<=N<=b و با مُد c داریم:

import numpy as np
a=np.random.triangular(-4,-2,6)
print(a)

در قطعه کد بالا، قرار است یک عدد تصادفی تولید کنیم از توزیع مثلثی! بین بازه منفی 4 تا مثبت 6! بطوریکه مُد توزیع نیز منفی 2 باشد!

که مثلاً ممکن است خروجی آن به صورت زیر باشد!:

-2.406330554228589

تولید عدد تصادفی از توزیع نرمال (Normal) در پایتون (Python)

فرم کلّی:

np.random.normal(miu,sigma)

فرض می‌کنیم که می‌خوایم از توزیع نرمال به فرم N(μ=1000,σ=2) یک عدد تصادفی تولید کنیم، پس داریم!:

import numpy as np
a=np.random.normal(1000,2)
print(a)

و مثلاً خروجیش میشه: 997.6353688995247

تولید عدد تصادفی از توزیع نمایی (Exponential) در پایتون (Python)

فرم کلّی:

np.random.exponential(beta)

فرض کنید قرار است از توزیع نمایی Exp(β=2) یک عدد تصادفی تولید کنیم! در این صورت می‌نویسیم:

import numpy as np
a=np.random.exponential(2)
print(a)

که صرفاً به عنوان یک مثال خروجیش میشه!:

2.1170123973285313

توجه کنید که میانگین توزیع رو داریم میدیم به این تابع تا برامون عدد تصادفی تولید کنه! (که البته در مورد این جور مسائل، اول همین مطلب، خیلی مفصل صحبت کردیم! اگر ندیدید، حتماً مراجعه کنید به بخش جزوه پیش‌نیاز در ابتدای همین مطلب!)

تولید عدد تصادفی از توزیع گاما (Gamma) در پایتون (Python)

فرم کلّی:

np.random.gamma(alpha,beta)

فرض کنید قرار است از توزیع گاما به صورت Gamma(α=5,β=2) یک عدد تصادفی تولید کنیم! در این صورت می‌نویسیم:

import numpy as np
a=np.random.gamma(5,2)
print(a)

که به عنوان مثال و نمونه، خروجیش میشه!:

3.7843667202014406

اگر میخواید ببینید که اصلاً این توزیع گاما که داریم ازش عدد تصادفی تولید می‌کنیم، تابع چگالیش چی بوده که اصلاً ازش دارم عدد تصادفی تولید می‌کینم، به بخش جزوه پیش‌نیاز در ابتدای همین مطلب مراجعه کنید!

تولید عدد تصادفی از توزیع بتا (Beta) در پایتون (Python)

فرم کلّی:

np.random.beta(a,b)

این بار فرض کنید میخوایم یک عدد تصادفی از توزیع بتا به فرم Beta(a=0.5,b=0.5) تولید کنیم! باید کد زیر رو بنویسیم!:

import numpy as np
a=np.random.beta(0.5,0.5)
print(a)

که مثلاً خروجیش میشه:

0.9833010436841305 !

تولید عددِ تصادفی از توزیع وایبول (Weibull) در پایتون (Python)

فرم کلّی: اولاً باید حتما توضیحات رو بخونید چون پکیج NumPy اینجا خوب نیست! و از پکیج random خود پایتون (python) استفاده می‌کنیم! که فرم کلی اون میشه:

rd.weibullvariate(alpha,beta)

اگر قرار باشد، یک عدد تصادفی از توزیع وایبول Weibull(α=2,β=1) تولید کنیم! متاسفانه یکم به مشکل می‌خوریم!! البته بازهم ما براش راه حل داریم! ولی خب یه ذره مشکل رووو شاخشه!

نکته‌ی اول اینکه پکیج NumPy متاسفانه تولید عددتصادفی برای توزیع وایبول رو فقط به ازای α=1 انجام میده! (واقعا چرا؟؟!!!) که خب بدردمون نمی‌خوره! ما حالت کلی رو دوست داریم!

خود پایتون هم تووی خودش یک پکیج داره (که اصلاً نیاز نداره نصب کنید حتی)! به اسم random، که از اون می‌تونید استفاده کنید! قبل از آموزش کدنویسی تولید عدد تصادفی با اون! بذارید به این سوالی احتمالی شما که: “خب چه کاریه! همونو آموزش میدادید!” جواب بدم!

واقعیت اینه که پکیج NumPy برای تولید عدد تصادفی خیلی خوب و قوی عمل میکنه! و برای همین ما (و خیلی های دیگه) این پکیج رو به پکیج random خود پایتون ترجیح میدن! و بیاید این کم‌کاری پکیج NumPy در مورد توزیع گاما رو ببخشیم!

اما میشه بجاش اینجوری عمل کرد!:

import random as rd
a=rd.weibullvariate(2,5)
print(a)

هرچند مشخصه ولی بازهم توضیح میدم:

توی خط اول، پکیج random رو فراخوانی می‌کنیم! و چون حوصله نداریم هِی به طور کامل بنویسیم random، می‌گیم as (یعنی به عنوان) rd این بنده خدا رو import کن! تا از این به بعد با rd صداش بزنیم! نه با random که اسم طولانی‌تری است و حوصله نداریم!!!

در خط دوم هم عددتصادفی رو میریزیم توی متغیر a و در خط سوم هم چاپش می‌کنیم!

که مثلاً خروج میشه!:

1.7950542759870798

شاید بازهم بپرسید خب اصلاً این توزیع وایبول که داره ازش عدد تولید میکنه، چجوری و چه شکلیه؟! بازهم میگم باید به جزوه پیش‌نیاز که در ابتدای همین مطلب برای دانلود گذاشتیم مراجعه کنید!

تولید عددِ تصادفی از توزیع مربع کای (Chi-Square) در پایتون (Python)

فرم کلّی:

np.random.chisquare(df)

اگر بخوایم از توزیع مربع کای χ2(ν=5) یک عددتصادفی تولید کنیم، داریم!:

import numpy as np
a=np.random.chisquare(5)
print(a)

که مثلاً خروجی زیر رو میده!:

4.717493848179437

تولید عدد تصادفی از توزیع t یا همان (t-student) در پایتون (Python)

فرم کلّی:

np.random.standard_t(df)

برای تولید عددتصادفی از توزیع t(ν=3) داریم!:

import numpy as np
a=np.random.standard_t(3)
print(a)

که مثلاً خروجی زیر رو میده!:

-1.8219390742711274

تولید عددِ تصادفی از توزیع فیشر (Fisher) در پایتون (Python)

فرم کلّی:

np.random.f(df1,df2)

مثلاً برای تولید یک عددتصادفی از توزیع فیشر F(5,7) داریم!:

import numpy as np
a=np.random.f(5,7)
print(a)

که به عنوان نمونه، خروجی زیر را می‌دهد!:

2.1399994342643542

تولید عددِ تصادفی از توزیع لاپلاس (Laplace) در پایتون (Python)

فرم کلّی:

np.random.laplace(miu,lambda)

برای تولید یک عدد تصادفی از توزیع لاپلاس Laplace(μ=-4,λ=4) داریم!:

import numpy as np
a=np.random.laplace(-4,4)
print(a)

که مثلاً خروجی زیر را خواهد داد!:

-2.7088183363078913

سوال: چجوری مثلاً 50تا عدد تصادفی ایجاد کنیم؟!

کلاً برای ایجاد چندتا (مثلاً 50 تا عددتصادفی) باید به صورت زیر عمل کنیم! من در زیر توزیع یکنواخت گسسته رو مثال میزنم! ولی در مورد بقیه هم صادقه!

import numpy as np
x= np.random.randint(1,101,size=50)

این میاد از 1 تا 100، به تعداد 50تا عدد ایجاد میکنه! خروجی این 50تا عدد تصادفی رو هم ریختیم توی متغیری به اسم x ! 

پس کلاً یادمون باشه با اووون مولفه size توی این توابع (چه اینی که اینجا گفتیم و چه بقیه!) میتونید چندتا عددتصادفی ایجاد کنید!

مطالب مرتبط

تعریف و نام گذاری متغیرها و انواع متغیرها در پایتون (Python) + فیلم در این مطلب از سری...

بانک تمرین پایتون - کاربرد private کردن در class (کلاس) در پایتون در این مطلب از مجموعه مطالب...

جزئیات نوشته
تعداد دیدگاه 6
تعداد بازدید 11.4K
تاریخ انتشار 29/03/2019
تاریخ بروزرسانی 29/03/2019
نویسنده گروه آموزشی کولاک
برای ارسال دیدگاه ابتداواردشوید