تولید اعداد تصادفی در پایتون — به زبان ساده (+ دانلود فیلم آموزش گام به گام)

تصادفی بودن، بخش مهمی از «پیکربندی» (Configuration) و «ارزیابی» (Evaluation) الگوریتمهای «یادگیری ماشین» (Machine Learning) را تشکیل میدهد. از مقداردهی اولیه تصادفی وزنها در «شبکه عصبی مصنوعی» (Artificial Neural Network) تا بخشبندی دادهها به صورت تصادفی به دو دسته «مجموعه تست» (Test Set) و «مجموعه آموزش» (Train Set) و همچنین، «برُ زدن تصادفی» (Random Shuffling) مجموعه داده تست در «گرادیان نزولی تصادفی»، همه و همه نیاز به تسلط بر مهارت تولید اعداد تصادفی و استفاده از تصادفی بودن دارند. در این مطلب، روش تولید اعداد تصادفی در پایتون مورد بررسی قرار خواهد گرفت. در ادامه، مباحث زیر بررسی خواهند شد:
- تصادفی بودن، با استفاده از «مولدهای اعداد شبه تصادفی» (Pseudorandom Number Generators) قابل اعمال در برنامهها است.
- روش تولید اعداد تصادفی و استفاده از تصادفی بودن با استفاده از کتابخانههای استاندارد «زبان برنامهنویسی پایتون» (Python Programming Language) شرح داده میشود.
- روش تولید آرایههایی از اعداد تصادفی با کتابخانه «نامپای» (NumPy) شرح داده میشود.
مفاهیم بیان شده، در سه بخش کلی مولدهای اعداد شبه تصادفی، اعداد تصادفی با پایتون و اعداد تصادفی با «نامپای» (NumPy) شرح داده میشوند.
مولدهای اعداد شبه تصادفی
منبع تصادفی بودنی که در برنامهها و الگوریتمها تزریق میشود، ترفند ریاضیاتی است که مولد اعداد تصادفی نامیده میشود. مولد اعداد تصادفی، سیستمی است که اعداد تصادفی را از یک منبع درست از تصادفی بودن تولید میکند. معمولا، یک ابزار اندازهگیری پدیده فیزیکی مانند «شمارشگر گایگر مولر» (Geiger-Müller Counter)، جایی است که نتایج به اعداد تصادفی مبدل میشوند.
در یادگیری ماشین، به تصادفی بودن نیازی نیست. بلکه، از اعداد «شبه تصادفی» (Pseudorandom) استفاده میشود. اعداد شبه تصادفی، نمونهای از اعداد محسوب میشوند که بسیار شبیه به اعداد تصادفی هستند، اما با استفاده از یک فرایند قطعی تولید شدهاند.
در بُر زدن دادهها و مقداردهی اولیه ضرایب با مقادیر تصادفی از مولدهای اعداد شبه تصادفی استفاده میشود. این برنامههای کوچک، اغلب توابعی هستند که پس از فراخوانی شدن، یک عدد تصادفی را باز میگردانند. در صورت فراخوانی مجدد، این برنامهها یک عدد تصادفی جدید را باز میگردانند. توابع پوششی (Wrapper Functions) نیز موجود هستند و به کاربر این امکان را میدهند که عدد تصادفی را به صورت «عدد صحیح» (Integer)، «ممیز شناور» (Floating Point)، با یک توزیع احتمالی خاص و یا در یک طیف خاص دریافت کند.
ارقام مربوط به اعداد تصادفی طبق یک توالی ایجاد میشوند. توالی قطعی است و با یک مقدار اولیه «دانه» (seed) آغاز میشود. اگر کاربر صراحتا به مولد اعداد تصادفی دانه ندهد، امکان دارد مولد از زمان سیستم به ثانیه یا میلیثانیه به عنوان دانه استفاده کند. مقدار دانه اهمیتی ندارد. کاربر میتواند هر آنچه میخواهد را انتخاب کند. آنچه اهمیت دارد این است که دانه دادن یکسان به فرایند، منجر به توالی مشابهی از اعداد تصادفی میشود. در ادامه، مثالهایی در این مورد ارائه میشوند.
تولید اعداد تصادفی با پایتون
کتابخانه استاندارد پایتون، ماژولی با عنوان random فراهم میکند که دارای دستهای از توابع برای تولید اعداد تصادفی است. پایتون از یک مولد اعداد تصادفی مستحکم و محبوب به نام Mersenne Twister بهره میبرد که یک توالی از اعداد تقریبا تصادفی را تولید میکند. این مولد، پارامتری را برای آغاز توالی دریافت میکند که «دانه» (seed) نامیده میشود. تابع قطعی است، بدین معنا که دادن یک دانه مشابه، هر بار منجر به تولید توالی مشابهی از اعداد میشود. انتخاب دانه اهمیتی ندارد.
تابع ()seed به مولد اعداد تصادفی، دانه میدهد و یک عدد صحیح مانند ۱ یا ۷ را به عنوان آرگومان دریافت میکند. اگر تابع ()seed پیش از استفاده از تابع تصادفی بودن فراخوانی نشود، به طور پیشفرض، از زمان سیستم به میلیثانیه از مبدا تاریخ موجود در بایوس (۱۹۷۰) برای تولید اعداد تصادفی استفاده میشود. مثال زیر، چگونگی دانه دادن به مولد عدد تصادفی را نشان میدهد که بر اثر آن، اعداد تصادفی تولید میشوند. همچنین، نشان میدهد که دانه دادن مجدد به مولدها منجر به تولید توالی مشابهی از اعداد تصادفی میشود.
# seed the pseudorandom number generator from random import seed from random import random # seed random number generator seed(1) # generate some random numbers print(random(), random(), random()) # reset the seed seed(1) # generate some random numbers print(random(), random(), random())
با اجرای مثال بالا، به مولد اعداد تصادفی دانه با مقدار ۱ داده میشود؛ مولد، ۳ عدد تصادفی تولید میکند، مجددا به مولد دانه داده میشود و همانطور که مشهود است، سه عدد تصادفی مشابه تولید میشوند.
0.13436424411240122 0.8474337369372327 0.763774618976614 0.13436424411240122 0.8474337369372327 0.763774618976614
تنظیم کردن دانه، برای کنترل تصادفی بودن و حصول اطمینان از اینکه کد هر بار از توالی مشابهی استفاده میکند، درست مانند مدل تولید، بسیار مفید خواهد بود. برای اجرای آزمایشهایی که در آنها تصادفی بودن برای کنترل متغیرهای مداخلهگر مورد استفاده قرار میگیرد، امکان دارد یک دانه متفاوت برای هر اجرای آزمایشی مورد استفاده قرار بگیرد.
مقادیر ممیز شناور تصادفی
مقادیر ممیز شناور تصادفی، با استفاده از تابع ()random قابل استفاده هستند. مقادیر در بازه بین صفر و یک و به ویژه در بازه (0,1] تولید میشوند. مقادیر از یک «توزیع یکنواخت» (Uniform Distribution) حاصل میشوند، بدین معنا که هر مقدار دارای شانس برابری برای تولید شدن دارد. مثال زیر، ۱۰ مقدار تصادفی ممیز شناور را تولید میکند.
# generate random floating point values from random import seed from random import random # seed random number generator seed(1) # generate random numbers between 0-1 for _ in range(10): value = random() print(value)
با اجرای قطعه کد بالا، مقادیر تصادفی ممیز شناور، تولید و چاپ میشوند.
0.1343642441124012 0.8474337369372327 0.763774618976614 0.2550690257394217 0.49543508709194095 0.4494910647887381 0.651592972722763 0.7887233511355132 0.0938595867742349 0.02834747652200631
مقادیر ممیز شناور را میتوان با ضرب کردن آنها با اندازه دامنه تغییرات (range) و افزودن مقدار کمینه (min) به آن، تغییر مقیاس داد.
scaled value = min + (value * (max - min))
در کد بالا، min و max، به ترتیب مقادیر کمینه و بیشینه از یک طیف دلخواه هستند، و value مقداری است که توسط روند تولید اعداد تصادفی در فاصله ۰ تا ۱ تولید شده است.
اعداد صحیح تصادفی
مقادیر صحیح تصادفی را میتوان با تابع ()randint تولید کرد. این تابع، دو آرگومان دریافت میکند؛ شروع و پایان طیف برای مقادیر صحیح تولید شده، دو آرگومان دریافتی هستند. اعداد صحیح تصادفی در طیف مقادیر شروع و پایان و با احتساب خود این مقادیر (بازه بسته [start, end]) تولید میشوند. مثال زیر، ۱۰ عدد تصادفی را بین ۰ و ۱۰ تولید میکند.
# generate random integer values from random import seed from random import randint # seed random number generator seed(1) # generate some integers for _ in range(10): value = randint(0, 10) print(value)
با اجرای قطعه کد بالا، ده عدد تصادفی صحیح تولید میشود.
2 9 1 4 1 7 7 7 10 6
تولید اعداد گاوسی تصادفی
مقادیر ممیز شناور تصادفی را میتوان از یک توزیع گاوسی با استفاده از تابع ()gauss ایجاد کرد. این تابع، دو آرگومانی که متناظر با پارامترهای توزیع نرمال (گاوسی) یعنی میانگین و انحراف معیار هستند را دریافت میکند.. مثال زیر، ۱۰ عدد تصادفی از توزیع گاوسی را با میانگین ۰.۰ و انحراف معیار ۱.۰ تولید میکند. توجه به این نکته لازم است که این پارامترها محدودیتی روی مقادیر ایجاد نمیکنند و توزیع مقادیر بر اساس شکل زنگی (زنگولهای)، توزیع کنترل میشود؛ از آنجایی که شکل توزیع نرمال، متقارن است، برای مقادیر مثبت و منفی (بزرگتر و کوچکتر از صفر) احتمال تولید عدد تصادفی یکسان است.
# generate random Gaussian values from random import seed from random import gauss # seed random number generator seed(1) # generate some Gaussian values for _ in range(10): value = gauss(0, 1) print(value)
با اجرای قطعه کد مثال بالا، ۱۰ مقدار گاوسی تصادفی ایجاد میشود.
1.2881847531554629 1.449445608699771 0.06633580893826191 -0.7645436509716318 -1.0921732151041414 0.03133451683171687 -1.022103170010873 -1.4368294451025299 0.19931197648375384 0.13337460465860485
انتخاب تصادفی از یک لیست
اعداد تصادفی برای انتخاب تصادفی یک آیتم از لیست نیز قابل استفاده هستند. برای مثال، اگر یک لیست از حروف a, b, c, d در اختیار داشته باشیم و بخواهیم به شکل تصادفی یک کلمه ۱۰ حرفی (با جایگذاری) ایجاد کنیم از تابع ()choice استفاده خواهیم کرد.
انتخابها با «توزیع یکنواخت» (Uniform Likelihood) انجام میشوند. قطعه کدی که در زیر آمده، این کار را انجام داده است و حروف مربوط به یک کلمه ۱۰ حرفی را از لیست حروف داده شده، ایجاد کرده است.
# choose a random element from a list from random import seed from random import choice # seed random number generator seed(1) # prepare a sequence sequence = ["a","b","c","d"] print(sequence) # make choices from the sequence for _ in range(10): selection = choice(sequence) print(selection)
با اجرای مثال بالا، ابتدا یک لیست از مقادیر صحیح چاپ میشود، سپس، پنج مقدار تصادفی از میان آیتمهای این لیست انتخاب و چاپ میشوند. البته از آنجایی مقدار (1)seed داده شده، با تکرار برنامه همین حروف ایجاد خواهد شد.
['a', 'b', 'c', 'd'] b a c a d d d d b a
زیرنمونه تصادفی از یک لیست
کاربر ممکن است تمایل به تکرار فرایند انتخاب مقادیر تصادفی از لیست داشته باشد تا یک زیرمجموعه انتخاب شده به صورت تصادفی بسازد. مهمتر آنکه، هنگامی که یک عنصر از لیست انتخاب و به زیر مجموعه اضافه شد، مجددا نباید اضافه شود. به این کار، انتخاب بدون جایگذاری گفته میشود، زیرا هنگامی که یک عنصر از لیست برای زیر مجموعه انتخاب شد، مجددا به لیست اصلی اضافه نمیشود (برای انتخاب مجدد موجود نیست). این رفتار، توسط تابع ()sample ارائه میشود که طی آن، لیست و اندازه زیرمجموعه به select به عنوان آرگومان داده میشود. توجه به این نکته لازم است که آیتمها از لیست اصلی حذف نشدهاند، بلکه، تنها در یک کپی از لیست انتخاب شدهاند. مثال زیر چگونگی انتخاب یک زیر مجموعه حاوی سه عنصر را از لیستی حاوی چهار حرف اولی لاتین، نشان میدهد.
# select a random sample without replacement from random import seed from random import sample # seed random number generator seed(11) # prepare a sequence sequence = ["a","b","c","d"] print(sequence) # select a subset without replacement subset = sample(sequence, 3) print(subset)
با اجرای قطعه کد بالا، ابتدا یک لیست از مقادیر صحیح چاپ و سپس، یک نمونه تصادفی از آن انتخاب و چاپ میشود.
['a', 'b', 'c', 'd'] ['d', 'c', 'b']
بُر زدن تصادفی یک لیست
از تصادفی بودن میتوان برای بُر زدن تصادفی یک لیست از عناصر مانند بُر زدن ورقهای بازی استفاده کرد. از تابع ()shuffle میتوان برای انجام این کار، استفاده کرد. shuffle دادهها را در جای خودشان بُر میزند، بدین معنا که لیست به عنوان یک آرگومان برای تابع ()shuffle ارائه، بر زده و باز گردانده میشود. در حقیقت این تابع لیست بر زده شده را به جای کپی در یک لیست جدید، به شکل درجا ایجاد میکند. مثال زیر چگونگی بر زدن تصادفی یک لیست از اعداد صحیح را نشان میدهد. همانطور که میبینید تابع (shuffle(sequence به متغیر دیگری نسبت داده نشده و حاصل اجرای این تابع (یعنی بُر زدن) در همان لیست sequence دیده خواهد شد.
# randomly shuffle a sequence from random import seed from random import shuffle # seed random number generator seed(1) # prepare a sequence sequence = [i for i in range(20)] print(sequence) # randomly shuffle the sequence shuffle(sequence) print(sequence)
با اجرای مثال بالا، یک لیست از اعداد صحیح چاپ میشود، سپس همان لیست به صورت تصادفی بُر میخورد.
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] [11, 5, 17, 19, 9, 0, 16, 1, 15, 6, 10, 13, 14, 12, 7, 3, 8, 2, 18, 4]
تولید اعداد تصادفی با نامپای
در یادگیری ماشین، از کتابخانههایی مانند «سایکیتلِرن» (Scikit-Learn) و «کرس» (Keras) استفاده میشود. این کتابخانهها مبتنی بر «نامپای» (NumPy) هستند و در واقع، از کتابخانه نامپای در پس خود استفاده میکنند. NumPy کتابخانهای است که قادر به انجام محاسبات بسیار کارآمد روی بردارها و ماتریسها است.
نامپای، پیادهسازی اختصاصی از مولد اعداد تصادفی را بوسیله توابع پوششی دارد. همچنین، این کتابخانه مولد اعداد شبهتصادفی Mersenne Twister را پیادهسازی میکند. در ادامه، مثالهایی پیرامون تولید اعداد تصادفی و استفاده از تصادفی بودن با آرایههای NumPy ارائه میشود.
سید دادن به مولد اعداد تصادفی
مولد اعداد تصادفی NumPy از کتابخانه استاندارد پایتون متفاوت است. مهمتر آنکه، دانه دادن به مولد اعداد شبهتصادفی پایتون، مولد اعداد تصادفی NumPy را تحت تاثیر قرار نمیدهد. این دو باید به طور جداگانه دانه داده و استفاده شوند. تابع ()seed را میتوان برای دانه دادن به مولد اعداد شبه تصادفی NumPy استفاده کرد که یک مقدار صحیح را به عنوان دانه دریافت میکند. مثال زیر نشان میدهد که چگونه به مولد دانه داده میشود و چطور، دانه دادن مجدد مولد منجر به توالی مشابهی از اعداد تصادفی تولید شده میشود.
# seed the pseudorandom number generator from numpy.random import seed from numpy.random import rand # seed random number generator seed(1) # generate some random numbers print(rand(3)) # reset the seed seed(1) # generate some random numbers print(rand(3))
با اجرای قطعه کد بالا، به مولد اعداد شبه تصادفی دانه داده میشود و یک توالی از اعداد تصادفی چاپ میشود؛ سپس، مجددا به مولد دانه داده میشود و دقیقا اعداد تصادفی مشابهی با آنچه پیشتر تولید شده بود، نمایش داده میشوند.
[4.17022005e-01 7.20324493e-01 1.14374817e-04] [4.17022005e-01 7.20324493e-01 1.14374817e-04]
آرایهای از اعداد ممیز شناور تصادفی
یک آرایه از مقادیر ممیز شناور تصادفی را میتوان با استفاده از تابع نامپای ()rand تولید کرد. اگر هیچ آرگومانی فراهم نشود، یک مقدار تصادفی مجرد ساخته میشود، در غیر این صورت، اندازه آرایه را میتوان تعیین کرد. مثال زیر، یک آرایه از ۱۰ عدد تصادفی ممیز شناور با توزیع یکنواخت میسازد.
# generate random floating point values from numpy.random import seed from numpy.random import rand # seed random number generator seed(1) # generate random numbers between 0-1 values = rand(10) print(values)
با اجرای قطعه کد بالا، آرایه نامپای از اعداد تصادفی ممیز شناور تولید و چاپ میشود.
[4.17022005e-01 7.20324493e-01 1.14374817e-04 3.02332573e-01 1.46755891e-01 9.23385948e-02 1.86260211e-01 3.45560727e-01 3.96767474e-01 5.38816734e-01]
آرایهای از مقادیر صحیح تصادفی
یک آرایه از مقادیر تصادفی صحیح را میتوان با استفاده از تابع پایتون ()randint تولید کرد. این تابع، سه آرگومان کمترین مقدار بازه، بیشترین مقدار بازه و تعداد اعداد صحیح یا اندازه آرایه اعداد صحیح را دریافت میکند. اعداد صحیح از یک توزیع یکنواخت از کمترین مقدار تا بیشترین مقدار بازه پیروی میکنند (بازه به صورت (lower, upper] که شامل مقدار upper نیست). در مثال زیر، چگونگی ساختن یک آرایه از اعداد صحیح تصادفی نشان داده شده است.
# generate random integer values from numpy.random import seed from numpy.random import randint # seed random number generator seed(1) # generate some integers values = randint(0, 10, 20) print(values)
با اجرای قطعه کد بالا، آرایهای شامل ۲۰ عدد صحیح بین ۰ و ۱۰ ساخته میشود.
[5 8 9 5 0 0 1 7 6 9 2 4 5 2 4 2 4 7 7 9]
آرایهای از مقادیر تصادفی گاوسی
یک آرایه از مقادیر گاوسی تصادفی را میتوان با استفاده از تابع ()randn نامپای ساخت. این تابع یک آرگومان یکتا را به منظور تعیین اندازه آرایه حاصل شده دریافت میکند. مقادیر گاوسی از توزیع استاندارد گاوسی گرفته شدهاند؛ این توزیع دارای میانگین ۰.۰ و انحراف معیار ۱.۰ است. قطعه کد زیر، نشان میدهد که چطور میتوان یک آرایه از اعداد تصادفی گاوسی را تولید کرد.
# generate random Gaussian values from numpy.random import seed from numpy.random import randn # seed random number generator seed(1) # generate some Gaussian values values = randn(10) print(values)
با اجرای قطعه کد بالا، یک آرایه از ۱۰ مقدار تصادفی از توزیع استاندارد گاوسی تولید میشود.
[ 1.62434536 -0.61175641 -0.52817175 -1.07296862 0.86540763 -2.3015387 1.74481176 -0.7612069 0.3190391 -0.24937038]
مقادیر حاصل از توزیع استاندارد گاوسی را میتوان با ضرب کردن در انحراف معیار و اضافه کردن میانگین به یک توزیع گاوسی با میانگین و انحراف معیار دلخواه، تغییر مقیاس داد.
scaled value = mean + value * stdev
در قطعه کد بالا، mean و stdev، میانگین و انحراف معیار برای یک توزیع گاوسی دلخواه هستند و value مقدار حاصل از تولید عدد تصادفی با توزیع استاندارد گاوسی است. محاسبه صورت گرفته باعث ایجاد یک عدد تصادفی از توزیع گاوسی با میانگین mean و انحراف استاندارد stdev خواهد شد.
بُر زدن آرایه نامپای
یک آرایه نامپای را میتوان به صورت تصادفی در جای خود (بدون تهیه یک کپی از لیست) با استفاده از تابع ()shuffle نامپای بُر زد. مثال زیر نشان میدهد که چگونه میتوان یک آرایه نامپای را بُر زد.
# randomly shuffle a sequence from numpy.random import seed from numpy.random import shuffle # seed random number generator seed(1) # prepare a sequence sequence = [i for i in range(20)] print(sequence) # randomly shuffle the sequence shuffle(sequence) print(sequence)
با اجرای قطعه کد بالا، ابتدا لیستی حاوی ۲۰ عدد صحیح ساخته میشود و سپس، همان آرایه بُر زده و چاپ میشود.
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] [3, 16, 6, 10, 2, 14, 4, 17, 7, 1, 13, 0, 19, 18, 9, 15, 8, 12, 11, 5]
جمعبندی
در این راهنما، چگونگی تولید اعداد تصادفی و کار با آنها در زبان برنامهنویسی پایتون شرح داده شد. یکی از مباحثی که در این مطلب بیان شد، این است که اعداد تصادفی در برنامهها با استفاده از مولد اعداد تصادفی تولید میشوند.
همچنین، چگونگی تولید اعداد تصادفی و استفاده از آنها با کتابخانه استاندارد پایتون تشریح شد. در پایان، چگونگی تولید آرایهای از اعداد تصادفی با استفاده از کتابخانه نامپای مورد بررسی قرار گرفت.
اگر مطلب بالا برای شما مفید بوده، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای آمار و احتمالات
- آموزش آمار و احتمال مهندسی
- مجموعه آموزشهای دادهکاوی و یادگیری ماشین
- زبان برنامهنویسی پایتون (Python) — از صفر تا صد
- یادگیری علم داده (Data Science) با پایتون — از صفر تا صد
- پیادهسازی الگوریتمهای یادگیری ماشین با پایتون و R — به زبان ساده
- اعداد تصادفی (Random Numbers) — تاریخچه و کاربردها
^^
باسلام
چگونه اعدادی که به صورت رندوم انتخاب شده رو با فونت فارسی نشون بده؟؟
چطور میشه کاری کنیم که اضافه پرینت نگیره؟
یعنی دوبار یک عدد یا حرف رو پرینت نگیره؟
دید روشنتری نسبت به ایجاد تصادفی پیدا کردم سپاسگزارم