Randomitatea este în jurul nostru. Când întoarceți o monedă sau rotiți o moară, nu puteți fi niciodată sigur de rezultatul final. Această imprevizibilitate are o mulțime de aplicații, cum ar fi determinarea câștigătorilor unei remiză norocoasă sau generarea de cazuri de testare pentru un experiment cu valori aleatorii produse pe baza unui algoritm.
Ținând cont de această utilitate, Python ne-a furnizat modulul aleatoriu. Puteți să-l utilizați în jocuri pentru a arunca inamici în mod aleatoriu sau pentru a amesteca elementele dintr-o listă.
Aproape toate funcțiile din acest modul depind de baza întâmplător()
funcția, care va genera un flotor aleatoriu mai mare sau egal cu zero și mai puțin de unul. Python utilizează Mersenne Twister pentru a genera plutitorii. Produce flotoare de precizie de 53 biți cu o perioadă de 2 ** 19937-1. Acesta este, de fapt, cel mai răspândit generator generice de pseudo-aleatoare.
Uneori, doriți ca generatorul de numere aleatoare să reproducă secvența numerelor pe care le-a creat prima dată. Acest lucru poate fi obținut prin furnizarea aceleiași valori de însămânțare de două ori generatorului folosind semințe (s, versiune)
funcţie. Dacă parametrul s este omis, generatorul va folosi timpul curent al sistemului pentru a genera numerele. Iată un exemplu:
import random random.seed (100) random.random () # întoarce 0.1456692551041303 random.random () # returnează 0.45492700451402135
Rețineți că, spre deosebire de un flip de monede, modulul generează numere pseudo-aleatoare care sunt complet deterministe, deci nu este potrivit pentru scopuri criptografice.
Modulul are două funcții diferite pentru a genera numere întregi aleatorii. Poți să folosești randrange (a)
pentru a genera un număr întreg aleator mai mic decât A
.
În mod similar, puteți utiliza randrange (a, b [, pas])
pentru a genera un număr aleatoriu de la interval (a, b, pas)
. De exemplu, folosind randament random (0, 100, 3)
va returna numai acele cifre între 0 și 100 care sunt, de asemenea, divizibile cu 3.
Dacă știți atât limita inferioară cât și cea superioară între care doriți să generați numerele, puteți utiliza o funcție mai simplă și mai intuitivă numită randint (a, b)
. Este pur și simplu un alias pentru randrange (a, b + 1)
.
import random random.randrange (100) # returneaza 65 random.randrange (100) # returneaza 98 random.randrange (0, 100, 3) # returneaza 33 random.randrange (0, 100, 3) # returneaza random.randint 1,6) # returnează 4 random.randint (1,6) # returnează 6
Pentru a selecta un element aleator dintr-o secvență non-goală dată, puteți utiliza funcția alegere (seq)
funcţie. Cu randint ()
, vă limitați la o selecție de numere dintr-o anumită gamă. alegere (seq)
vă permite să alegeți un număr din orice secvență dorită.
Un alt lucru bun despre această funcție este că nu se limitează doar la numere. Poate selecta orice tip de element aleator dintr-o secvență. De exemplu, numele câștigătorului unei desene norocoase între cinci persoane diferite, furnizat ca șir, poate fi determinat utilizând această funcție cu ușurință.
Dacă doriți să amestecați o secvență în loc să selectați un element aleatoriu din ea, puteți utiliza funcția Aleatoriu (seq)
funcţie. Acest lucru va duce la o la loc amestecarea secvenței. Pentru o secvență cu doar 10 (n) elemente, pot exista un total de 3628800 (n!) Diferite aranjamente. Cu o secvență mai mare, numărul de permutări posibile va fi chiar mai mare - aceasta implică faptul că funcția nu poate genera niciodată toate permutările unei secvențe mari.
Să presupunem că trebuie să alegeți 50 de studenți dintr-un grup de 100 de studenți pentru a merge într-o călătorie.
În acest moment, puteți fi tentat să utilizați alegere (seq)
funcţie. Problema este că va trebui să o numiți de aproximativ 50 de ori în scenariul cel mai bun caz în care nu alege din nou același student.
O soluție mai bună este să utilizați proba (seq, k)
funcţie. Va reveni o listă de k elemente unice din secvența dată. Secvența inițială este lăsată neschimbată. Elementele din lista rezultată vor fi în ordine de selecție. Dacă k este mai mare decât numărul de elemente din secvența în sine, va fi ridicată o valoare ValueError.
import ID aleatoare = [1, 8, 10, 12, 15, 17, 25] random.choice (ids) # returnează 8 random.choice (ids) # returnează 15 nume = ['Tom', 'Harry', Andrew ',' Robert '] random.choice (nume) # returnează Tom random.choice (nume) # întoarce Robert random.shuffle (nume) nume # întoarce [' Robert ',' Andrew ',' Tom ',' Harry '] (nume, 2) # returneaza ['Tom', 'Robert'] nume # returneaza ['Robert', 'Andrew' 'Tom', 'Harry']
După cum puteți vedea, Aleatoriu (seq)
a modificat lista originală, dar proba (seq, k)
a păstrat-o intactă.
În această secțiune, veți afla despre funcțiile care pot fi utilizate pentru a genera numere aleatorii bazate pe distribuții specifice de valoare reală. Parametrii majorității acestor funcții sunt numiți după variabila corespunzătoare în ecuația efectivă a distribuției.
Când doriți doar un număr între 0 și 1, puteți utiliza funcția întâmplător()
funcţie. Dacă doriți ca numărul să se afle într-un anumit interval, puteți utiliza funcția uniformă (a, b)
funcția cu A și b ca limite inferioare și superioare, respectiv.
Să presupunem că trebuie să generați un număr aleator între scăzut și înalt astfel încât are o probabilitate mai mare de a se afla în vecinătatea unui alt număr mod. Puteți face acest lucru cu triunghiular (mod scăzut, înalt)
funcţie. scăzut și înalt Valorile vor fi 0 și 1 în mod implicit. În mod similar, mod valoarea implicită la valoarea intermediară a valorii scăzute și ridicate, rezultând o distribuție simetrică.
Există o mulțime de alte funcții, precum și pentru a genera numere aleatorii bazate pe distribuții diferite. De exemplu, puteți utiliza normalvariate (mu, sigma)
pentru a genera un număr aleator pe baza unei distribuții normale, cu mu ca medie și sigma ca abatere standard.
import random random.random () # returnează 0.8053547502449923 random.random () # returnează 0.05966180559620815 random.uniform (1, 20) # întoarce 11.970525425108205 random.uniform (1, 20) # returnează 7.731292430291898 random.triangular (1, 100, 80) # returnează 42.328674062298816 aleatoriu triunghiular (1, 100, 80) # retur 73.54693076132074
După cum am văzut, este posibil să se genereze numere aleatorii cu distribuție uniformă, precum și distribuție triunghiulară sau normală. Chiar și într-o gamă finită de la 0 la 100, există un număr infinit de flotoare care pot fi generate. Ce se întâmplă dacă există un set finit de elemente și doriți să adăugați mai multă greutate unor anumite valori în timp ce selectați un număr aleatoriu? Această situație este obișnuită în sistemele de loterie unde numerele cu puțină recompensă primesc o pondere ridicată.
Dacă este acceptabil ca aplicația să aibă greutăți care sunt valori întregi, puteți crea o listă de elemente a căror frecvență depinde de greutatea lor. Puteți folosi apoi alegere (seq)
pentru a selecta în mod aleator un element din această listă ponderată. Iată un exemplu care arată selectarea aleatorie a unui premiu.
importul aleatoare w_prizes = [('$ 1', 300), ('$ 2', 50), ('$ 10', 5), ('$ 100', 1)] prize_list = [premiul pentru premiu, greutate în w_prizes pentru i in interval (greutate)] random.choice (prize_list) # returnează '$ 1'
În cazul meu, a fost nevoie de zece procese pentru a obține un premiu de 2 $ ales din listă. Șansele de a obține un premiu de 100 $ ar fi mult mai mici. În mod similar, puteți adăuga părtinire și altor programe similare.
Acest modul poate fi util într-o mulțime de situații, cum ar fi amestecarea întrebărilor într-o misiune sau generarea unor nume de utilizator sau parole aleatoare pentru utilizatorii dvs., utilizând amesteca()
funcţie. Puteți genera, de asemenea, numere aleatorii în mod uniform, precum și să dați ponderare numerelor într-un anumit interval. În următorul tutorial, vom folosi funcțiile din acest modul pentru a genera date aleatorii pentru analiza statistică.
Aveți în minte unele aplicații interesante ale generatoarelor de numere aleatoare care pot fi utile cititorilor colegi? Spuneți-ne în comentariile.