Ачааллж байна...
Долоон бүлгийн өмнөх нэг амлалтыг саная. Бүлэг 6-д тоо таах тоглоомоо барихдаа бид шударга тохиролцоо хийсэн: "нууц тоог программ өөрөө сонгодоггүй — кодонд шууд бичиж өгнө: кодоо харсан хүн хариуг мэдчихнэ; жинхэнэ санамсаргүй тоо сонгуулдаг багаж Бүлэг 13-т бий." Бүлэг 7-д тоглоомоо онотол таадаг болгохдоо ч тэр өрөө "гурав дахь, эцсийн шинэчлэл" гэж дахин тэмдэглэсэн. Өнөөдөр тэр өдөр: random — санамсаргүйн хайрцаг — таны хамгийн урт хүлээлгэсэн өрийн эзэн. Энэ хайрцагны гол багаж randint нь ганцхан мөрөөр таны тоглоомд өдий хүртэл дутаж байсан ганц зүйлийг өгнө: хэн ч — бүр программыг бичсэн та ч — урьдчилан мэдэхгүй нууц.
Санамсаргүй байдал яагаад тоглоомд ийм амин чухал вэ гэдгийг нэг хормын турш бодоцгооё. Шоо хаяхад юу гарахыг мэддэг байсан бол шоо хаях утгагүй; хөзрийн суудал урьдчилан мэдэгддэг бол хөзөр тоглоом биш. Тоглоомын "амь" нь үл мэдэгдэхэд оршдог — тэгвэл компьютерын тоглоомд тэр үл мэдэгдэхийг хэн бүтээх вэ: Бүлэг 1-ээс хойшхи бидний мэддэг компьютер бол "зөвхөн өгсөн зааврыг биелүүлдэг, юу ч өөрөө шийддэггүй" машин шүү дээ — тэр яаж "санамсаргүй" байж чадах юм бэ? Гүн сонин асуулт — товч бөгөөд шударга хариулт нь: жинхэнэ утгаараа чадахгүй — random модуль нь маш нарийн тооцоогоор санамсаргүй мэт харагдах тоонууд үйлдвэрлэдэг ("хуурамч-санамсаргүй" гэж нэрлэдэг) бөгөөд тэр "мэт" нь тийм төгс тул тоглоом, сугалаа, дүрслэл гээд өдөр тутмын бүх хэрэгцээнд жинхэнээс ялгарахгүй үйлчилдэг. Бидний хэрэглээнд: randint бол шударга шоо — түүнээс нарийн ярианы гүн рүү энэ сургалт орохгүй.
Randint-ийн ажлыг сугалааны уут гэж төсөөл. Уутанд бөмбөлгүүд: тус бүр дээр тоо бичээстэй — та уутыг бэлдэхдээ хүрээг нь тогтооно: "1-ээс 10 хүртэлх бүх тоо" гэвэл яг арван бөмбөлөг. Тэгээд randint дуудагдах бүрд уутнаас нэг бөмбөлөг сугалж, тоог нь хэлээд — бөмбөлгөө буцааж хийнэ: дараагийн сугалалт мөн л бүрэн уутнаас (тиймээс нэг тоо дараалан хоёр гарч болно — "буцааж хийдэг" учраас: жинхэнэ шоо ч хоёр удаа зургаа буудаг биз дээ). Гурван чанарыг уутнаас авъя: нэг — хүрээг та тогтооно, сугалалтыг uut хийнэ: randint(1, 10) — хоёр argument нь уутны доод, дээд хил; хоёр — бөмбөлөг бүр тэгш боломжтой: 1 гарах магадлал 10 гарахтай яг ижил; гурав — өмнөх сугалалт дараагийнхад нөлөөгүй: уут "санахгүй." Тэгээд нэг чухал бичиглэлийн онцлог — таны range-тэй харьцуулбал гэнэтийн нь: randint(1, 10)-д 10 нь ордог! Range-ийн "зогсоол орохгүй" дүрэмд долоон бүлэг дасчихсан таны гарт энэ нь урхи мэт санагдаж болно — тийм ээ, Python-ы хоёр багаж хоёр өөр журамтай нь үнэн: тайлбар нь randint-ийн нэрэнд бий — interval буюу "завсар": математикийн [1, 10] завсар хоёр захаа оруулдаг — "1-ээс 10 хүртэл сугал" гэсэн хүний яриаг үгчлэн дагадаг гэсэн үг: уутанд 10-ын бөмбөлөг бий. Хоёр журмын зааг алдаануудын хэсэгт эргэж ирнэ.
Шоогоо хаяж үзье:
python
import random
too = random.randint(1, 10)
print(too)Run — жишээ нь 7. Дахин Run — 3. Дахин — 10. Дахин — 3 (дахин гарч болно — уут буцааж хийдэг!). Мөрүүд нь бүгд танил эд анги: import random — хайрцгийг авчрав (файлын эхэнд, чимээгүй); random.randint(1, 10) — хайрцагнаас randint багаж, хаягтай дуудлага, хоёр argument (доод ба дээд хил — хоёул орно); гардуулдаг тогооч тул too хайрцганд хадгалав — гардуулалт нь жирийн int: тооцоололд орно, харьцуулагдана, f-string-д сууна. Ганцхан мөр — гэтэл энэ мөр таны программчлалын нэг суурь төсөөллийг эвдэж байгааг ажигла: Бүлэг 3-аас хойш таны бүх программ "ижил орцод ижил гарц" байсан — Run бүрд яг ижил үр дүн: тэр урьдчилан таамаглагдах чанарыг бид "компьютерын хамгийн том давуу тал" гэж хүртэл нэрлэсэн. Одоо таны гарт "Run бүрд өөр" программ байна — таамаглагдашгүй нь эвдрэл биш, зориулалт нь болсон анхны мөр: тоглоомын ертөнцийн хаалга яг энд.
Хоёр дахь жишээ: шоо хаях тоглоом — хоёр уут зэрэг. Хоёр хүн шоо хаяж уралдъя:
python
import random
minii = random.randint(1, 6)
niiziin = random.randint(1, 6)
print(f"Миний шоо: {minii}")
print(f"Найзын шоо: {niiziin}")
if minii > niiziin:
print("Би яллаа!")
elif niiziin > minii:
print("Найз яллаа!")
else:
print("Тэнцлээ!")Гурван боломж — гурван зам: Бүлэг 6-гийн "их-бага-тэнцүү" гурвал санамсаргүй орцтой болмогц жинхэнэ тоглоом төрөв: Run бүрд өөр тэмцээн, өөр ялагч. Хоёр дуудлага хоёр тусдаа сугалалт гэдгийг ажигла: minii ба niiziin ижил (1, 6) хүрээтэй ч бие даасан — нэг нь нөгөөдөө нөлөөгүй (уут санахгүй!). Randint(1, 6) — жинхэнэ шооны зургаан тал: багаж бодит юмсын "тоон хувилбарыг" ийм шууд буулгадаг — зоос бол randint(1, 2), хонхны сугалаа бол randint(1, оролцогчдын_тоо)...
Гурав дахь жишээ: loop дотор — санамсаргүйн урсгал. Уутнаас олон удаа сугалбал:
python
import random
print("Таван удаа шоо хаяя:")
niilber = 0
for i in range(5):
shoo = random.randint(1, 6)
print(f"{i + 1} дэх хаялт: {shoo}")
niilber = niilber + shoo
print(f"Нийт оноо: {niilber}")Жишээ гарц (таных өөр байна — цаашид ч жишээ гарцууд маань "жишээ" гэдгээ энэ утгаар ойлгоорой):
Таван удаа шоо хаяя:
1 дэх хаялт: 4
2 дэх хаялт: 2
3 дэх хаялт: 6
4 дэх хаялт: 2
5 дэх хаялт: 5
Нийт оноо: 19Randint биеийн дотор байгааг ажигла — тойрог бүрд шинэ сугалалт: import-ыг биш (тэр эхэнд нэг л удаа!) дуудлагыг давтдаг. Хуримтлуулагч + loop + randint: Бүлэг 7-ын хэв маягууд санамсаргүйтэй нийлээд "олон удаагийн туршилт" гэсэн шинэ төрлийн программ төрүүлэв — мөрийтэй биш даалуу шиг тоглоомын оноо тоолохоос эхлээд "мянган удаа шоо хаявал дундаж нь хэд гарах бол" гэсэн жинхэнэ туршилтын асуултууд хүртэл (сониуч нь range(1000) болгоод niilber / 1000-ыг хэвлээд үзээрэй — 3.5 орчим тогтдогийг нээх нь магадлалын ухааны үүдээр шагайсан хэрэг).
Дөрөв дэх жишээ: том амлалтын биелэл — тоглоомын гурав дахь төрөлт. Одоо гол ёслол. Too_taah.py файлаа нээ — Бүлэг 7-ын хувилбар чинь дотор нь байгаа: nuuts_too = 7 гэсэн ил нууцтайгаа. Өөрчлөлт нь — итгэхэд бэрх — хоёрхон мөр: дээд талд import, тэгээд тэр ганц мөрийг солино:
python
# Тоо таах тоглоом — жинхэнэ санамсаргүй хувилбар
import random
nuuts_too = random.randint(1, 10)
oroldlogo = 0
print("Би 1-ээс 10-ын хооронд нэг тоо бодлоо")
while True:
taamag = int(input("Таамгаа хэлээрэй: "))
oroldlogo = oroldlogo + 1
if taamag == nuuts_too:
print(f"Оноов! Та {oroldlogo} оролдлогоор таалаа")
break
elif taamag > nuuts_too:
print("Их байна — миний тоо үүнээс бага")
else:
print("Бага байна — миний тоо үүнээс их")
print("Тоглосонд баярлалаа!")nuuts_too = random.randint(1, 10) — энэ мөр биелэх агшинд уутнаас нэг тоо сугалагдаж nuuts_too-д хадгалагдана: тэр цагаас хойш программын хувьд ердийн variable — харьцуулалтууд хуучин хэвээрээ ажиллана (нэг л удаа сугалаад хадгалж байгааг ажигла: loop дотор сугалдаг байсан бол нууц тоо таамаг бүрийн дараа өөрчлөгдөөд тоглоом онох аргагүй болно — randint-ийн байрлал бол тоглоомын дүрэм өөрөө!). Одоо Run дараад тоглоод үз: та өөрөө таагаад ол доо — өөрийн бичсэн тоглоомоо өөрөө жинхэнээсээ тоглож буй анхны мөч: кодыг нь бүтээгч нь хүртэл нууцыг нь мэдэхгүй. Гурван төрөлтөө эргэн харъя: Бүлэг 6 — нэг оролдлого, ил нууц (шүүлтийн тархи); Бүлэг 7 — онотол, тоолуур (давталтын зүрх); Бүлэг 13 — жинхэнэ нууц (санамсаргүйн амь): нэг тоглоом гурван Түвшинг дамжин таны мэдлэгтэй хамт өссөн — энэ файл бол таны аяллын хамгийн үнэн түүхч.
Хүсвэл туршаад үзээрэй: хүрээгээ томсгоорой — randint(1, 100) болгоод зарлалын мөрөө хамт шинэчлээд, "их-бага" чиглүүлгийн үнэ цэн том хүрээнд хэрхэн өсдөгийг мэдрээрэй (зөв тактикаар 100-гийн доторх ямар ч тоо долоон оролдлогод олддог — яагаад гэдгийг бодох нь өөрөө сайхан оньсого). Сонирхвол random хайрцгийг цааш уудлаарай: random.choice(["чулуу", "хайч", "цаас"]) — list-ээс санамсаргүй гишүүн сугалдаг багаж: чулуу-хайч-цаас тоглоомын түлхүүр гарт чинь оров — Бүлэг 6-гийн if/elif мэдлэгтэй нийлүүлбэл бүтэн тоглоом болно: жинхэнэ сорилт хүссэн хүнд өнөөдрийн "гэрийн зугаа."
Алдаа 1: range-ийн дүрмээр randint-д хандах. Амласан хоёр журмын мөргөлдөөн:
python
import random
shoo = random.randint(1, 7)Алдааны мэдэгдэлгүй — тэр нь л аюул: "зургаан талт шоо" гэж бодоод range-ийн дадлаараа "дээд хил орохгүй байлгүй" гээд 7 тавьжээ — гэтэл randint хоёр захаа оруулдаг: энэ шоо хааяа 7 буудаг болжээ — мянган хаялтад зуу шахам удаа: тоглогчид "шоо эвдэрхий юм аа" гэж хэлүүлэх чимээгүй гажуудал. Урвуу нь ч бий: randint(1, 10)-ийн оронд range-маягаар (1, 11) гэвэл — 11 гарч "1-ээс 10" гэсэн зарлалаа зөрчинө. Хоёр журмаа нэг мөрөнд зэрэгцүүлж түгжье: range(1, 11) — 11 орохгүй, 1-10; randint(1, 10) — 10 орно, 1-10: хоёул "1-ээс 10" — бичиглэл нь өөр. Хамгаалах дадал нь хуучин танил: хүрээт багаж бичих бүрдээ "хамгийн бага нь хэд, хамгийн их нь хэд гарах вэ" гэсэн хоёр асуултаар өөрийгөө шалга — off-by-one-ы мөнхийн эм.
Алдаа 2: Сугалалтыг хадгалалгүй хоёр дахин дуудах. Санамсаргүйн онцлог урхи:
python
import random
print(f"Таны азын тоо: {random.randint(1, 100)}")
if random.randint(1, 100) > 50:
print("Азтай өдөр байна!")Алдаагүй — гэхдээ логик нь эвдэрхий: хоёр мөрөнд хоёр өөр сугалалт явагдаж байна — хэвлэсэн "азын тоо" чинь 20 байтал if нь өөр сугалалтаар 80 авч "Азтай өдөр" гэж магадгүй: хэрэглэгчид "20 гэчихээд азтай гэнэ ээ?!" Randint дуудлага бүр шинэ бөмбөлөг — "саяын тоо" гэсэн ойлголт дуудлагад байхгүй: нэг сугалалтыг олон газар хэрэглэх бол нэг удаа сугалж хайрцганд хадгал — too = random.randint(1, 100) гээд цаашид too-гоо хэрэглэ. Энэ бол "function-ий гардуулалтыг хадгал" гэсэн хуучин дадлын санамсаргүй-хувилбар: энгийн function-д дахин дуудлага "зүгээр л илүү ажил" байдаг бол randint-д — өөр хариулт: хадгалалт энд тав тух биш, зөв ажиллагааны нөхцөл.
Алдаа 3: Randint-ийн гардуулалтыг string-тэй харьцуулах. Хуучин урхи шинэ дүрээр:
python
import random
nuuts = random.randint(1, 10)
taamag = input("Таамаг: ")
if taamag == nuuts:
print("Оноов!")Алдааны мэдэгдэлгүй — гэхдээ хэзээ ч онохгүй тоглоом: int() мартагджээ — taamag нь string ("7"), nuuts нь int (7): "хэзээ ч тэнцдэггүй хоёр ертөнц" — Бүлэг 6-гийн чимээгүй урхи randint-тэй хослохоор бүр зальтай болдог нь: тоглогч "аан таасангүй байх нь" гээд л тоглосоор... бүх тоог хэлчихээд ч онохгүйд л сэжиглэж эхэлдэг — санамсаргүй байдал нь алдааг "азгүйдэл" мэт өнгөлөн далдалдаг: энэ бол random-той программын оношлогооны онцлог сургамж: "хачирхалтай зан" харагдвал эхлээд санамсаргүйг түр унтраа — nuuts = random.randint(...) мөрөө коммэнтлоод nuuts = 7 гэсэн тогтмолоор түр сольчихвол (Бүлэг 3-ын "унтраалга" дадал!) программ таамаглагдахуйц болж, урхи нүдэнд ил гарна: засаад — санамсаргүйгээ буцааж асаа.
random.randint(a, b) — a-гаас b хүртэлх санамсаргүй бүхэл тоо: хоёр зах хоёул орно (range-ээс өөр журам: randint(1, 10) — 10 гарч болно!); дуудлага бүр шинэ, бие даасан "сугалалт."
Гардуулалт нь жирийн int: хадгал, харьцуул, тооцоол — нэг сугалалтыг олон газар хэрэглэх бол заавал нэг удаа сугалж variable-д хадгал (дуудлага бүр өөр хариулттай!).
Тоглоомын томьёо: randint нэг л удаа (loop-ын гадна) сугалж нууц болгож хадгал — тоглоом гурав дахь, эцсийн төрөлтөө хийв: бүтээгч нь ч мэдэхгүй нууцтай.
Random-той программын онош: "хачирхалтай зан" гарвал санамсаргүйг түр тогтмолоор сольж (коммэнтлож) таамаглагдахуйц болгоод мөшги.
Компьютерын "санамсаргүй" нь маш нарийн "мэт" — тоглоом, сугалааны бүх хэрэгцээнд хангалттай; random.choice(list) — жагсаалтаас сугалагч: дараагийн тоглоомуудын түлхүүр.
Дараагийн хичээл бол энэ бүлгийн сүүлчийн шинэ хайрцагнууд: datetime ба math — огноо цагийн болон математикийн богино аялал: өнөөдрийн огноо, одоогийн цаг, хэдэн ашигтай тооны багаж. Зориудаар товч хичээл: зорилго нь эзэмшүүлэх биш — ийм хайрцагнууд байдгийг, хаалга нь нэг түлхүүрээр онгойдогийг батлах: тэгээд тэмдэглэлийн дэвтрийн "огноотой тэмдэглэл" өр эзнээ олно.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.