Python'ning random modulini o'rganing. Psevdotasodifiylik, urug'lash, butun sonlar, suzuvchi sonlar, ketma-ketliklar generatsiyasi va xavfsiz dasturlar uchun eng yaxshi amaliyotlar haqida bilib oling.
Python Random Moduli: Psevdotasodifiy Sonlar Generatsiyasiga Chuqur Sho'ng'ish
Kompyuter olamida tasodifiylik kuchli va muhim tushunchadir. U murakkab ilmiy simulyatsiyalar va mashinalarni o'rganish modellaridan tortib video o'yinlar va xavfsiz ma'lumotlarni shifrlashgacha bo'lgan hamma narsaning harakatlantiruvchi kuchidir. Python bilan ishlashda bu tasodif elementini kiritish uchun asosiy vosita o'rnatilgan random modulidir. Biroq, u taqdim etadigan "tasodifiylik" muhim bir ogohlantirish bilan birga keladi: u haqiqatan ham tasodifiy emas. Bu psevdotasodifiy.
Ushbu keng qamrovli qo'llanma sizni Python'ning random
moduliga chuqur sho'ng'ishga olib boradi. Biz psevdotasodifiylikni sirini ochamiz, modulning asosiy funktsiyalarini amaliy misollar bilan o'rganamiz va eng muhimi, undan qachon foydalanish kerakligini va xavfsizlikka sezgir ilovalar uchun yanada mustahkam vositaga qachon murojaat qilish kerakligini muhokama qilamiz. Siz ma'lumotlar olimi, o'yin ishlab chiqaruvchisi yoki dasturiy ta'minot muhandisi bo'lasizmi, ushbu modulni yaxshi tushunish sizning Python vositalar to'plamingiz uchun fundamentaldir.
Psevdotasodifiylik nima?
Sonlarni yaratishni boshlashdan oldin, nima bilan ishlayotganimizning mohiyatini tushunish juda muhim. Kompyuter deterministik mashinadir; u ko'rsatmalarga aniq amal qiladi. U o'zining tabiati bilan havodan haqiqatan ham tasodifiy sonni yarata olmaydi. Haqiqiy tasodifiylik faqat atmosferadagi shovqin yoki radioaktiv parchalanish kabi oldindan aytib bo'lmaydigan fizik hodisalardan olinishi mumkin.
Buning o'rniga, dasturlash tillari Psevdotasodifiy Sonlar Generatorlaridan (PRNG) foydalanadi. PRNG - bu tasodifiy ko'rinadigan, ammo aslida urug' deb ataladigan boshlang'ich qiymat bilan to'liq aniqlanadigan sonlar ketma-ketligini yaratadigan murakkab algoritmdir.
- Deterministik Algoritm: Sonlar ketma-ketligi matematik formula bilan yaratiladi. Agar siz algoritm va boshlang'ich nuqtani bilsangiz, ketma-ketlikdagi har bir sonni bashorat qilishingiz mumkin.
- Urug': Bu algoritmga dastlabki kirishdir. Agar siz PRNG-ga bir xil urug'ni taqdim etsangiz, u har safar bir xil "tasodifiy" sonlar ketma-ketligini yaratadi.
- Davr: PRNG tomonidan yaratilgan sonlar ketma-ketligi oxir-oqibat takrorlanadi. Yaxshi PRNG uchun bu davr astronomik darajada katta bo'lib, uni ko'pchilik ilovalar uchun amalda cheksiz qiladi.
Python'ning random
moduli Mersenne Twister algoritmidan foydalanadi, bu juda mashhur va mustahkam PRNG bo'lib, juda uzoq davrga ega (219937-1). U simulyatsiyalar, statistik namunalar olish va o'yinlar uchun juda yaxshi, lekin keyinroq ko'rib chiqadiganimizdek, uning bashorat qilinishi uni kriptografiya uchun yaroqsiz qiladi.
Generatorni Urug'lash: Reproduktivlikning Kaliti
'Tasodifiy' ketma-ketlikni urug' orqali boshqarish qobiliyati nuqson emas; bu kuchli xususiyat. Bu reproduktivlikni kafolatlaydi, bu ilmiy tadqiqotlar, sinov va disk raskadrlashda muhimdir. Agar siz mashinalarni o'rganish tajribasini o'tkazayotgan bo'lsangiz, natijalarni adolatli taqqoslash uchun tasodifiy vaznni ishga tushirish yoki ma'lumotlarni aralashtirish har safar bir xil bo'lishini ta'minlashingiz kerak.
Buni boshqarish funktsiyasi random.seed()
.
Keling, uni amalda ko'rib chiqaylik. Birinchidan, urug'ni o'rnatmasdan skriptni ishga tushiramiz:
import random
print(random.random())
print(random.randint(1, 100))
Agar siz ushbu kodni bir necha marta ishga tushirsangiz, har safar turli natijalarga erishasiz. Buning sababi shundaki, agar siz urug'ni taqdim etmasangiz, Python generatorni ishga tushirish uchun operatsion tizimdan joriy tizim vaqti kabi deterministik bo'lmagan manbadan avtomatik ravishda foydalanadi.
Endi urug'ni o'rnatamiz:
import random
# 1- ishga tushirish
random.seed(42)
print("1- ishga tushirish:")
print(random.random()) # Natija: 0.6394267984578837
print(random.randint(1, 100)) # Natija: 82
# 2- ishga tushirish
random.seed(42)
print("\n2- ishga tushirish:")
print(random.random()) # Natija: 0.6394267984578837
print(random.randint(1, 100)) # Natija: 82
Ko'rib turganingizdek, generatorni bir xil urug' bilan ishga tushirish orqali (42 raqami odatiy tanlovdir, lekin har qanday butun son mos keladi), biz bir xil sonlar ketma-ketligini olamiz. Bu takrorlanadigan simulyatsiyalar va tajribalarni yaratishning asosidir.
Sonlar Generatsiyasi: Butun Sonlar va Suzuvchi Sonlar
random
moduli turli xil sonlarni yaratish uchun boy funktsiyalar to'plamini taqdim etadi.
Butun Sonlarni Generatsiyalash
-
random.randint(a, b)
Bu siz foydalanadigan eng keng tarqalgan funktsiya bo'lishi mumkin. U shunday tasodifiy butun son
N
ni qaytaradi, bundaa <= N <= b
. Shuni yodda tutingki, u ikkala oxirgi nuqtani ham o'z ichiga oladi.# Olti qirrali standart zarni simulyatsiya qiling die_roll = random.randint(1, 6) print(f"Siz {die_roll} ni tashladingiz")
-
random.randrange(start, stop[, step])
Bu funktsiya yanada moslashuvchan va Python-ning o'rnatilgan
range()
funktsiyasi kabi ishlaydi. Urange(start, stop, step)
dan tasodifiy tanlangan elementni qaytaradi. Eng muhimi, ustop
qiymatini o'z ichiga olmaydi.# 0 va 10 oralig'idagi tasodifiy juft sonni oling (10 ni o'z ichiga olmaydi) even_number = random.randrange(0, 10, 2) # Mumkin bo'lgan natijalar: 0, 2, 4, 6, 8 print(f"Tasodifiy juft son: {even_number}") # 0 dan 99 gacha bo'lgan tasodifiy sonni oling num = random.randrange(100) # random.randrange(0, 100, 1) ga teng print(f"0-99 oralig'idagi tasodifiy son: {num}")
Suzuvchi Sonlarni Generatsiyalash
-
random.random()
Bu eng fundamental suzuvchi sonni yaratish funktsiyasidir. U yarim ochiq diapazonda
[0.0, 1.0)
tasodifiy suzuvchi sonni qaytaradi. Bu 0.0 ni o'z ichiga olishi mumkin, lekin har doim 1.0 dan kam bo'ladi degan ma'noni anglatadi.# 0.0 va 1.0 oralig'ida tasodifiy suzuvchi sonni yarating probability = random.random() print(f"Yaratilgan ehtimollik: {probability}")
-
random.uniform(a, b)
Ma'lum bir diapazonda tasodifiy suzuvchi sonni olish uchun
uniform()
dan foydalaning. U shunday tasodifiy suzuvchi sonN
ni qaytaradi, bundaa <= N <= b
yokib <= N <= a
.# Simulyatsiya uchun Selsiyda tasodifiy haroratni yarating temp = random.uniform(15.5, 30.5) print(f"Simulyatsiya qilingan harorat: {temp:.2f}°C")
-
Boshqa Taqsimotlar
Modul, shuningdek, real olamdagi hodisalarni modellashtiradigan turli xil boshqa taqsimotlarni qo'llab-quvvatlaydi, ular ixtisoslashtirilgan simulyatsiyalar uchun bebahodir:
random.gauss(mu, sigma)
: Normal (yoki Gaussian) taqsimoti, o'lchov xatoliklari yoki IQ ballari kabi narsalarni modellashtirish uchun foydali.random.expovariate(lambd)
: Eksponensial taqsimot, ko'pincha Poisson jarayonida voqealar orasidagi vaqtni modellashtirish uchun ishlatiladi.random.triangular(low, high, mode)
: Uchburchak taqsimoti, minimal, maksimal va eng ehtimol qiymatga ega bo'lganingizda foydali.
Ketma-ketliklar bilan Ishlash
Ko'pincha, sizga faqat tasodifiy son kerak emas; siz elementlar to'plamidan tasodifiy tanlov qilishingiz yoki ro'yxatni tasodifiy ravishda qayta tartiblashingiz kerak. random
moduli bunda juda yaxshi.
Tanlovlar va Tanlovlar Qilish
-
random.choice(seq)
Bu funktsiya bo'sh bo'lmagan ketma-ketlikdan (ro'yxat, tuple yoki satr kabi) bitta, tasodifiy tanlangan elementni qaytaradi. Bu oddiy va juda samarali.
ishtirokchilar = ["Alice", "Bob", "Charlie", "David", "Eve"] g'olib = random.choice(ishtirokchilar) print(f"Va g'olib... {g'olib}!") mumkin_bo'lgan_harakatlar = ("tosh", "qog'oz", "qaychi") kompyuter_harakati = random.choice(mumkin_bo'lgan_harakatlar) print(f"Kompyuter tanladi: {kompyuter_harakati}")
-
random.choices(population, weights=None, k=1)
Murakkabroq stsenariylar uchun
choices()
(ko'plik) populyatsiyadan bir nechta elementni tanlashga imkon beradi, o'rnini bosish bilan. Bu degani, bir xil element bir necha marta tanlanishi mumkin. Shuningdek, siz muayyan tanlovlarni boshqalardan ko'ra ehtimoliyroq qilish uchunweights
ro'yxatini belgilashingiz mumkin.# 10 ta tanga uloqtirishni simulyatsiya qiling flips = random.choices(["Bosh", "Dum"], k=10) print(flips) # 6 uch marta ko'proq bo'lishi mumkin bo'lgan vaznli zarni simulyatsiya qiling natijalar = [1, 2, 3, 4, 5, 6] vaznlar = [1, 1, 1, 1, 1, 3] vaznli_zar = random.choices(natijalar, weights=vaznlar, k=1)[0] print(f"Vaznli zar natijasi: {vaznli_zar}")
-
random.sample(population, k)
Populyatsiyadan bir nechta noyob elementlarni tanlashingiz kerak bo'lganda,
sample()
dan foydalaning. U o'rnini bosmasdan tanlovni amalga oshiradi. Bu lotereya raqamlarini chizish yoki tasodifiy loyiha guruhini tanlash kabi stsenariylar uchun juda mos keladi.# Lotereya o'yini uchun 1 dan 50 gacha bo'lgan 3 ta noyob raqamni tanlang lotereya_raqamlari = range(1, 51) g'olib_raqamlar = random.sample(lotereya_raqamlari, k=3) print(f"G'olib raqamlar: {g'olib_raqamlar}") # Ishtirokchilar ro'yxatidan 2 kishilik tasodifiy jamoani tuzing jamoa = random.sample(ishtirokchilar, k=2) print(f"Yangi loyiha jamoasi: {jamoa}")
Ketma-ketlikni Aralashtirish
-
random.shuffle(x)
Bu funktsiya o'zgaruvchan ketma-ketlikdagi (ro'yxat kabi) elementlarni tasodifiy ravishda qayta tartiblash uchun ishlatiladi. Shuni esda tutish muhimki,
shuffle()
ro'yxatni joyida o'zgartiradi vaNone
ni qaytaradi. Uning qaytarilish qiymatini o'zgaruvchiga tayinlashda keng tarqalgan xatoga yo'l qo'ymang.# Kartalar dastasini aralashtiring kartalar = ["Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King"] print(f"Asl tartib: {kartalar}") random.shuffle(kartalar) print(f"Aralashtirilgan tartib: {kartalar}") # Noto'g'ri foydalanish: # aralashtirilgan_kartalar = random.shuffle(kartalar) # Bu aralashtirilgan_kartalarni None ga o'rnatadi!
Muhim Ogohlantirish: Kriptografiya yoki Xavfsizlik uchun `random` dan FOYDALANMANG
Bu har qanday professional dasturchi uchun eng muhim xulosa. Mersenne Twister PRNG ning bashorat qilinishi uni har qanday xavfsizlik bilan bog'liq maqsad uchun butunlay xavfsiz qiladi. Agar hujumchi ketma-ketlikdan bir nechta sonni kuzata olsa, ular urug'ni hisoblashlari va keyingi barcha 'tasodifiy' sonlarni bashorat qilishlari mumkin.
Hech qachon random
modulidan quyidagilar uchun foydalanmang:
- Parollar, sessiya tokenlari yoki API kalitlarini yaratish.
- Parol xeshlash uchun tuz yaratish.
- Shifrlash kalitlarini yaratish kabi har qanday kriptografik funktsiya.
- Parolni qayta tiklash mexanizmlari.
Ish uchun To'g'ri Vosita: `secrets` Moduli
Xavfsizlikka sezgir ilovalar uchun Python secrets
modulini taqdim etadi (Python 3.6 dan beri mavjud). Ushbu modul operatsion tizim tomonidan taqdim etilgan eng xavfsiz tasodifiylik manbasidan foydalanish uchun maxsus ishlab chiqilgan. Bu ko'pincha Kriptografik jihatdan Xavfsiz Psevdotasodifiy Sonlar Generatori (CSPRNG) deb ataladi.
Umumiy xavfsizlik vazifalari uchun undan qanday foydalanishingiz mumkin:
import secrets
import string
# Olti o'n oltilik formatda xavfsiz, 16 baytli tokenni yarating
api_key = secrets.token_hex(16)
print(f"Xavfsiz API Kaliti: {api_key}")
# Xavfsiz URL-xavfsiz tokenni yarating
password_reset_token = secrets.token_urlsafe(32)
print(f"Parolni Qayta Tiklash Tokeni: {password_reset_token}")
# Kuchli, tasodifiy parolni yarating
# Bu kamida bitta kichik harf, bitta katta harf va bitta raqamli parolni yaratadi
-alfavit = string.ascii_letters + string.digits
password = ''.join(secrets.choice(alfavit) for i in range(12))
print(f"Yaratilgan Parol: {password}")
Qoida oddiy: agar u xavfsizlikka tegsa, secrets
dan foydalaning. Agar u modellashtirish, statistika yoki o'yinlar uchun bo'lsa, random
to'g'ri tanlovdir.
Yuqori Ishlashli Hisoblash uchun: `numpy.random`
Standart random
moduli umumiy maqsadli vazifalar uchun juda yaxshi bo'lsa-da, u ma'lumotlar fani, mashinalarni o'rganish va ilmiy hisoblashda keng tarqalgan talab bo'lgan sonlarning katta massivlarini yaratish uchun optimallashtirilmagan. Ushbu ilovalar uchun NumPy kutubxonasi sanoat standartidir.
numpy.random
moduli sezilarli darajada yuqori unumdorlikka ega, chunki uning asosiy implementatsiyasi kompilyatsiya qilingan C kodida. Shuningdek, u NumPy ning kuchli massiv ob'ektlari bilan uzluksiz ishlash uchun mo'ljallangan.
Keling, millionta tasodifiy suzuvchi sonni yaratish uchun sintaksisni taqqoslaylik:
import random
import numpy as np
import time
# Standart `random` kutubxonasidan foydalanish
boshlash_vaqti = time.time()
tasodifiy_ro'yxat = [random.random() for _ in range(1_000_000)]
tugatish_vaqti = time.time()
print(f"Standart 'random' {tugatish_vaqti - boshlash_vaqti:.4f} sekundni oldi")
# NumPy dan foydalanish
boshlash_vaqti = time.time()
numpy_massivi = np.random.rand(1_000_000)
tugatish_vaqti = time.time()
print(f"NumPy 'numpy.random' {tugatish_vaqti - boshlash_vaqti:.4f} sekundni oldi")
NumPy bir necha daraja tezroq ekanligini aniqlaysiz. Shuningdek, u ko'p o'lchovli ma'lumotlar bilan ishlash uchun ancha keng statistik taqsimotlar va vositalar to'plamini taqdim etadi.
Eng Yaxshi Amaliyotlar va Yakuniy Fikrlar
Keling, asosiy eng yaxshi amaliyotlar bilan sayohatimizni umumlashtiramiz:
- Reproduktivlik uchun Urug'lash: Testlar, simulyatsiyalar yoki mashinalarni o'rganish tajribalari kabi tasodifiy jarayonlaringiz takrorlanadigan bo'lishi kerak bo'lganda, har doim
random.seed()
dan foydalaning. - Xavfsizlik Birinchi O'rinda: Hech qachon
random
modulidan xavfsizlik yoki kriptografiya bilan bog'liq hech narsa uchun foydalanmang. Buning o'rniga har doimsecrets
modulidan foydalaning. Bu muhokama qilinmaydi. - To'g'ri Funktsiyani Tanlang: Niyatingizni eng yaxshi ifodalaydigan funktsiyadan foydalaning. Noyob tanlovga muhtojmisiz?
random.sample()
dan foydalaning. O'rnini bosish bilan og'irlangan tanlovga muhtojmisiz?random.choices()
dan foydalaning. - Ishlash Muhim: Og'ir sonli yuk ko'tarish uchun, ayniqsa katta ma'lumotlar to'plamlari bilan,
numpy.random
ning kuch va tezligidan foydalaning. - Joyida Ishlashni Tushuning:
random.shuffle()
ro'yxatni joyida o'zgartirishini unutmang.
Xulosa
Python'ning random
moduli standart kutubxonaning ko'p qirrali va ajralmas qismidir. Uning psevdotasodifiy tabiatini tushunish va sonlarni yaratish va ketma-ketliklar bilan ishlash uchun asosiy funktsiyalarini o'zlashtirish orqali siz ilovalaringizga dinamik xatti-harakatlarning kuchli qatlamini qo'shishingiz mumkin. Eng muhimi, uning cheklovlarini bilish va qachon secrets
yoki numpy.random
kabi ixtisoslashtirilgan vositalarga murojaat qilish orqali siz professional dasturiy ta'minot muhandisining uzoqni ko'ra bilish va g'ayratini namoyish etasiz. Shunday ekan, ishonch bilan simulyatsiya qiling, aralashtiring va tanlang!