Deși niciun computer nu poate genera numere cu adevărat aleatorii, Ruby oferă acces la o metodă care va reveni pseudorandom numere.
Niciun computer nu poate genera cu adevărat numere aleatorii pur prin calcul. Cel mai bun lucru pe care îl pot face este să genereze pseudorandom numere, care sunt o succesiune de numere care apărea aleator, dar nu sunt.
Pentru un observator uman, aceste numere sunt într-adevăr aleatorii. Nu vor exista secvențe scurte de repetare și, cel puțin pentru observatorul uman, ele nu vor prezenta un model clar. Cu toate acestea, având în vedere suficient timp și motivație, originalul sămânță poate fi descoperit, secvența recreată și următorul număr din secvență ghicit.
Din acest motiv, metodele discutate în acest articol nu ar trebui să fie utilizate probabil pentru a genera numere care trebuie să fie securizate criptografic.
Generatoare de număr pseudorandom trebuie să fie însămânțat pentru a produce secvențe care diferă de fiecare dată când este generat un nou număr aleatoriu. Nicio metodă nu este magică - aceste numere aparent aleatoare sunt generate folosind algoritmi relativ simple și aritmetică relativ simplă. Prin însămânțarea PRNG, îl începeți de fiecare dată la un alt punct. Dacă nu ați însămânțat-o, va genera aceeași secvență de numere de fiecare dată.
În Ruby, Kernel # srand metoda poate fi apelată fără argumente. Se va alege o sămânță de numere aleatoare în funcție de timp, ID-ul procesului și un număr de secvență. Pur și simplu apelând srand oriunde la începutul programului dvs., va genera o serie diferită de numere aparent aleatoare de fiecare dată când îl executați. Această metodă se numește implicit la pornirea programului și seminează PRNG cu timpul și ID-ul procesului (fără număr de secvență).
Odată ce programul este executat și Kernel # srand a fost numit implicit sau explicit, Kernel # Rand metodă poate fi numită. Această metodă, numită fără argumente, va returna un număr aleatoriu de la 0 la 1. În trecut, acest număr a fost de obicei marit la numărul maxim pe care doriți să îl generați și poate to_i l-a chemat să-l transforme într-un număr întreg.
Cu toate acestea, Ruby face lucrurile puțin mai ușoare dacă utilizați Ruby 1.9.x. Kernel # Rand metoda poate lua un singur argument. Dacă acest argument este a Numeric de orice fel, Ruby va genera un număr întreg de la 0 până la (și nu include) acest număr.
Cu toate acestea, ce se întâmplă dacă doriți să generați un număr între 10 și 15? De obicei, generați un număr de la 0 la 5 și îl adăugați la 10. Cu toate acestea, Ruby face mai ușor.
Asigurați-vă că acordați atenție celor două tipuri de intervale. Dacă ai sunat rand (10..15), asta ar genera un număr de la 10 la 15 inclusiv 15. Întrucât rand (10... 15) (cu 3 puncte) ar genera un număr de la 10 la 15 neincluzând 15.
Uneori ai nevoie de o secvență de numere cu aspect aleatoriu, dar trebuie să generezi aceeași secvență de fiecare dată. De exemplu, dacă generați numere aleatorii într-un test de unitate, ar trebui să generați aceeași secvență de numere de fiecare dată.
Un test de unitate care nu reușește pe o secvență ar trebui să eșueze din nou la următoarea derulare, dacă a generat o secvență de diferență data viitoare, s-ar putea să nu reușească. Pentru a face acest lucru, sună Kernel # srand cu o valoare cunoscută și constantă.
Implementarea Kernel # Rand este mai degrabă un-Ruby. Nu rezumă PRNG în niciun fel și nici nu vă permite să inițiați PRNG. Există un stat global pentru PRNG care are toate codurile. Dacă schimbați semințele sau schimbați altfel starea PRNG, aceasta poate avea o gamă mai largă de efecte decât ați anticipat.
Cu toate acestea, din moment ce programele se așteaptă ca rezultatul acestei metode să fie aleatoriu - acesta este scopul ei! - probabil că nu va fi niciodată o problemă. Numai dacă programul se așteaptă să vadă o secvență preconizată de numere, cum ar fi fost apelată srand cu o valoare constantă, ar trebui să vadă rezultate neașteptate.