Avastage Pythoni juhuslik moodul. Õppige pseudojuhuslikkusest, seemendamisest, täisarvude, ujukomaarvude, jadade genereerimisest ja turvaliste rakenduste parimatest tavadest.
Pythoni juhuslik moodul: põhjalik sukeldumine pseudojuhuslike numbrite genereerimisse
Arvutite maailmas on juhuslikkus võimas ja oluline mõiste. See on mootor kõigele, alates keerukatest teaduslikest simulatsioonidest ja masinõppe mudelitest kuni videomängude ja turvalise andmete krüptimiseni. Pythoniga töötades on peamine tööriist selle juhuslikkuse elemendi tutvustamiseks sisseehitatud random moodul. Kuid 'juhuslikkusel', mida see pakub, on kriitiline hoiatus: see ei ole tõeliselt juhuslik. See on pseudojuhuslik.
See põhjalik juhend viib teid sügavale sukeldumisele Pythoni random
moodulisse. Me demüstifitseerime pseudojuhuslikkuse, uurime mooduli põhilisi funktsioone praktiliste näidetega ja, mis kõige tähtsam, arutame, millal seda kasutada ja millal pöörduda turvalisuse suhtes tundlikumate rakenduste jaoks tugevama tööriista poole. Olenemata sellest, kas olete andmeteadlane, mänguarendaja või tarkvarainsener, on selle mooduli põhjalik mõistmine teie Pythoni tööriistakasti alus.
Mis on pseudojuhuslikkus?
Enne numbrite genereerimise alustamist on ülioluline mõista selle olemust, millega me töötame. Arvuti on deterministlik masin; see järgib täpselt juhiseid. Oma olemuselt ei saa see õhust tõeliselt juhuslikku numbrit genereerida. Tõelist juhuslikkust saab hankida ainult ettearvamatutest füüsilistest nähtustest, nagu atmosfäärimüra või radioaktiivne lagunemine.
Selle asemel kasutavad programmeerimiskeeled pseudojuhuslike numbrite generaatoreid (PRNG-sid). PRNG on keerukas algoritm, mis genereerib numbrite jada, mis tundub juhuslik, kuid on tegelikult täielikult määratud esialgse väärtusega, mida nimetatakse seeme.
- Deterministlik algoritm: Numbrite jada genereeritakse matemaatilise valemiga. Kui teate algoritmi ja lähtepunkti, saate ennustada kõiki jadas olevaid numbreid.
- Seeme: See on algoritmi esialgne sisend. Kui annate PRNG-le sama seemne, genereerib see täpselt sama 'juhuslike' numbrite jada iga kord.
- Periood: PRNG genereeritud numbrite jada kordub lõpuks. Hea PRNG puhul on see periood astronoomiliselt suur, muutes selle enamiku rakenduste jaoks praktiliselt lõpmatuks.
Pythoni random
moodul kasutab Mersenne Twisteri algoritmi, mis on väga populaarne ja tugev PRNG, millel on äärmiselt pikk periood (219937-1). See on suurepärane simulatsioonide, statistilise valimi ja mängude jaoks, kuid nagu me hiljem näeme, muudab selle ennustatavus selle krüptograafia jaoks sobimatuks.
Generaatori seemendamine: reproduktsiooni võti
Võime juhtida 'juhuslikku' jada seemne kaudu ei ole viga; see on võimas funktsioon. See tagab reproduktsiooni, mis on oluline teadusuuringutes, testimises ja silumises. Kui käivitate masinõppe eksperimenti, peate tagama, et teie juhuslikud kaalu initsialiseerimised või andmete segamised oleksid iga kord samad, et tulemusi õiglaselt võrrelda.
Seda juhtiv funktsioon on random.seed()
.
Vaatame seda tegevuses. Kõigepealt käivitame skripti ilma seemet seadmata:
import random
print(random.random())
print(random.randint(1, 100))
Kui käivitate selle koodi mitu korda, saate iga kord erinevaid tulemusi. Seda seetõttu, et kui te seemet ei anna, kasutab Python generaatori initsialiseerimiseks automaatselt mittedeterministlikku allikat operatsioonisüsteemist, näiteks praegust süsteemiaega.
NĂĽĂĽd seame seemne:
import random
# Run 1
random.seed(42)
print("Run 1:")
print(random.random()) # Output: 0.6394267984578837
print(random.randint(1, 100)) # Output: 82
# Run 2
random.seed(42)
print("
Run 2:")
print(random.random()) # Output: 0.6394267984578837
print(random.randint(1, 100)) # Output: 82
Nagu näete, saame generaatori sama seemnega (number 42 on tavapärane valik, kuid sobib ka iga täisarv) initsialiseerides täpselt sama numbrite jada. See on reproduktsiooni simulatsioonide ja katsete loomise nurgakivi.
Numbrite genereerimine: täisarvud ja ujukomaarvud
random
moodul pakub rikkalikku funktsioonide komplekti erinevat tĂĽĂĽpi numbrite genereerimiseks.
Täisarvude genereerimine
-
random.randint(a, b)
See on tõenäoliselt kõige levinum funktsioon, mida kasutate. See tagastab juhusliku täisarvu
N
nii, eta <= N <= b
. Pange tähele, et see on kaasa arvatud mõlemad lõpp-punktid.# Simuleerige tavalist kuuepoolset täringuveeretust die_roll = random.randint(1, 6) print(f"Sa veeretad {die_roll}")
-
random.randrange(start, stop[, step])
See funktsioon on paindlikum ja käitub nagu Pythoni sisseehitatud
range()
funktsioon. See tagastab juhuslikult valitud elemendirange(start, stop, step)
-st. Kriitiliselt on see välja arvatudstop
väärtusest.# Hankige juhuslik paarisarv vahemikus 0 kuni 10 (välja arvatud 10) even_number = random.randrange(0, 10, 2) # Võimalikud väljundid: 0, 2, 4, 6, 8 print(f"Juhuslik paarisarv: {even_number}") # Hankige juhuslik number vahemikus 0 kuni 99 num = random.randrange(100) # Samaväärne random.randrange(0, 100, 1) print(f"Juhuslik number 0-99: {num}")
Ujukomaarvude genereerimine
-
random.random()
See on kõige fundamentaalsem ujukomaarvu genereerimise funktsioon. See tagastab juhusliku ujukomaarvu vahemikus
[0.0, 1.0)
. See tähendab, et see võib sisaldada 0,0, kuid on alati väiksem kui 1,0.# Genereerige juhuslik ujukomaarv vahemikus 0,0 kuni 1,0 probability = random.random() print(f"Genereeritud tõenäosus: {probability}")
-
random.uniform(a, b)
Juhusliku ujukomaarvu hankimiseks konkreetses vahemikus kasutage
uniform()
. See tagastab juhusliku ujukomaarvuN
nii, eta <= N <= b
võib <= N <= a
.# Genereerige simulatsiooni jaoks juhuslik temperatuur Celsiuse järgi temp = random.uniform(15.5, 30.5) print(f"Simuleeritud temperatuur: {temp:.2f}°C")
-
Muud jaotused
Moodul toetab ka erinevaid muid jaotusi, mis modelleerivad reaalse maailma nähtusi, mis on hindamatud spetsialiseeritud simulatsioonide jaoks:
random.gauss(mu, sigma)
: normaalne (või Gaussi) jaotus, mis on kasulik näiteks mõõtmisvigade või IQ-skooride modelleerimiseks.random.expovariate(lambd)
: eksponentsiaalne jaotus, mida kasutatakse sageli sĂĽndmuste vahelise aja modelleerimiseks Poissoni protsessis.random.triangular(low, high, mode)
: kolmnurkne jaotus, kasulik, kui teil on minimaalne, maksimaalne ja kõige tõenäolisem väärtus.
Jadadega töötamine
Sageli ei vaja te ainult juhuslikku numbrit; peate tegema juhusliku valiku üksuste kogumist või loendi juhuslikult ümber korraldama. random
moodul paistab selles silma.
Valikute ja valikute tegemine
-
random.choice(seq)
See funktsioon tagastab ühe, juhuslikult valitud elemendi mittetühjast jadast (nagu loend, ennik või string). See on lihtne ja väga tõhus.
participants = ["Alice", "Bob", "Charlie", "David", "Eve"] winner = random.choice(participants) print(f"Ja võitja on... {winner}!") possible_moves = ("kivi", "paber", "käärid") computer_move = random.choice(possible_moves) print(f"Arvuti valis: {computer_move}")
-
random.choices(population, weights=None, k=1)
Keerulisemate stsenaariumide korral võimaldab
choices()
(mitmuslik) valida mitu elementi populatsioonist asendusega. See tähendab, et sama üksust saab valida rohkem kui üks kord. Samuti saate määrataweights
loendi, et muuta teatud valikud teistest tõenäolisemaks.# Simuleerige 10 mündivisket flips = random.choices(["Heads", "Tails"], k=10) print(flips) # Simuleerige kaalutud täringuveeretust, kus 6 on kolm korda tõenäolisem outcomes = [1, 2, 3, 4, 5, 6] weights = [1, 1, 1, 1, 1, 3] weighted_roll = random.choices(outcomes, weights=weights, k=1)[0] print(f"Kaalutud veeremise tulemus: {weighted_roll}")
-
random.sample(population, k)
Kui peate valima populatsioonist mitu unikaalset ĂĽksust, kasutage
sample()
. See teeb valiku ilma asenduseta. See sobib suurepäraselt selliste stsenaariumide jaoks nagu lotonumbrite loosimine või juhusliku projektitiimi valimine.# Valige loteriiloosimiseks 3 unikaalset numbrit vahemikust 1 kuni 50 lottery_numbers = range(1, 51) winning_numbers = random.sample(lottery_numbers, k=3) print(f"Võidunumbrid on: {winning_numbers}") # Moodustage juhuslik meeskond 2-st osalejate loendist team = random.sample(participants, k=2) print(f"Uus projektitiim on: {team}")
Jada segamine
-
random.shuffle(x)
Seda funktsiooni kasutatakse muudetava jada (nagu loendi) ĂĽksuste juhuslikuks ĂĽmberkorraldamiseks. Oluline on meeles pidada, et
shuffle()
muudab loendit kohapeal ja tagastabNone
. Ärge tehke tavalist viga, määrates selle tagastusväärtuse muutujale.# Segage kaardipakk cards = ["Äss", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Poiss", "Emand", "Kuningas"] print(f"Algne järjekord: {cards}") random.shuffle(cards) print(f"Segatud järjekord: {cards}") # Vale kasutamine: # shuffled_cards = random.shuffle(cards) # See määrab shuffled_cards väärtuseks None!
Kriitiline hoiatus: ÄRGE kasutage random
krüptograafia või turvalisuse jaoks
See on kõige olulisem järeldus iga professionaalse arendaja jaoks. Mersenne Twisteri PRNG ennustatavus muudab selle täiesti ebaturvaliseks mis tahes turvalisusega seotud eesmärgil. Kui ründaja saab jälgida mõnda numbrit jadast, võib ta potentsiaalselt arvutada seemne ja ennustada kõiki järgnevaid 'juhuslikke' numbreid.
Ärge kunagi kasutage random
moodulit:
- Paroolide, seansitunnuste või API-võtmete genereerimiseks.
- Paroolide räsimise soola loomiseks.
- Kõik krüptograafilised funktsioonid, nagu näiteks krüpteerimisvõtmete genereerimine.
- Parooli lähtestamise mehhanismid.
Õige tööriist tööks: secrets
moodul
Turvalisuse suhtes tundlike rakenduste jaoks pakub Python secrets
mooduli (saadaval alates Python 3.6). See moodul on spetsiaalselt loodud operatsioonisüsteemi pakutava kõige turvalisema juhuslikkuse allika kasutamiseks. Seda nimetatakse sageli krüptograafiliselt turvaliseks pseudojuhuslike numbrite generaatoriks (CSPRNG).
Siin on, kuidas te seda tavaliste turvaĂĽlesannete jaoks kasutaksite:
import secrets
import string
# Genereerige turvaline 16-baidine tunnus kuueteistkĂĽmnendsĂĽsteemis
api_key = secrets.token_hex(16)
print(f"Turvaline API-võti: {api_key}")
# Genereerige turvaline URL-i turvaline tunnus
password_reset_token = secrets.token_urlsafe(32)
print(f"Parooli lähtestamise tunnus: {password_reset_token}")
# Genereerige tugev, juhuslik parool
# See loob parooli, milles on vähemalt üks väiketäht, üks suurtäht ja üks number
-alphabet = string.ascii_letters + string.digits
password = ''.join(secrets.choice(alphabet) for i in range(12))
print(f"Genereeritud parool: {password}")
Reegel on lihtne: kui see puudutab turvalisust, kasutage secrets
. Kui see on modelleerimiseks, statistikaks või mängudeks, on random
õige valik.
Suure jõudlusega arvutamiseks: numpy.random
Kuigi standardne random
moodul sobib suurepäraselt üldotstarbelisteks ülesanneteks, ei ole see optimeeritud suurte numbrite massiivide genereerimiseks, mis on levinud nõue andmeteaduses, masinõppes ja teadusarvutustes. Nende rakenduste jaoks on NumPy teek tööstusstandard.
numpy.random
moodul on oluliselt jõudluslikum, kuna selle aluseks olev rakendamine on kompileeritud C-koodis. See on mõeldud ka sujuvalt töötama NumPy võimsate massiiviobjektidega.
Võrdleme süntaksit miljoni juhusliku ujukomaarvu genereerimiseks:
import random
import numpy as np
import time
# Standartteegi `random` kasutamine
start_time = time.time()
random_list = [random.random() for _ in range(1_000_000)]
end_time = time.time()
print(f"Standardne 'random' võttis: {end_time - start_time:.4f} sekundit")
# NumPy kasutamine
start_time = time.time()
numpy_array = np.random.rand(1_000_000)
end_time = time.time()
print(f"NumPy 'numpy.random' võttis: {end_time - start_time:.4f} sekundit")
Leiate, et NumPy on suurusjärgus kiirem. See pakub ka palju laiemat valikut statistilisi jaotusi ja tööriistu mitmemõõtmeliste andmetega töötamiseks.
Parimad tavad ja lõppmõtted
Võtame oma teekonna kokku mõne peamise parima praktikaga:
- Seeme reproduktsiooni jaoks: Kasutage alati
random.seed()
, kui soovite, et teie juhuslikud protsessid oleksid korratavad, näiteks testides, simulatsioonides või masinõppe eksperimentides. - Turvalisus ennekõike: Ärge kunagi kasutage
random
moodulit millegi puhul, mis on seotud turvalisuse või krüptograafiaga. Kasutage alati selle asemel moodulitsecrets
. See on läbirääkimistes osalemata. - Valige õige funktsioon: Kasutage funktsiooni, mis väljendab kõige paremini teie kavatsust. Vajate unikaalset valikut? Kasutage
random.sample()
. Kas vajate kaalutud valikut asendusega? Kasutagerandom.choices()
. - Jõudlus on oluline: Raskete numbriliste toimingute puhul, eriti suurte andmekogumitega, kasutage
numpy.random
jõudu ja kiirust. - Mõistke kohapealseid toiminguid: Arvestage, et
random.shuffle()
muudab loendit kohapeal.
Järeldus
Pythoni random
moodul on standardteegi mitmekülgne ja asendamatu osa. Mõistes selle pseudojuhuslikku olemust ja valdades selle põhifunktsioone numbrite genereerimiseks ja jadadega töötamiseks, saate oma rakendustele lisada dünaamilise käitumise võimsa kihi. Veelgi olulisem on see, et teades selle piiranguid ja seda, millal pöörduda spetsiaalsete tööriistade poole, nagu secrets
või numpy.random
, demonstreerite professionaalse tarkvarainseneri ettenägelikkust ja hoolsust. Nii et minge edasi – simuleerige, segage ja valige enesekindlalt!