Joks kompiuteris negali generuoti tikrai atsitiktinių skaičių, tačiau „Ruby“ suteikia prieigą prie metodo, kuris grįš slapyvardis skaičiai.
Joks kompiuteris negali generuoti tikrai atsitiktiniai skaičiai grynai skaičiavimo būdu. Geriausia, ką jie gali padaryti, yra generuoti slapyvardis skaičiai, kurie yra skaičių seka, kuri pasirodyti atsitiktiniai, bet nėra.
Žmogaus stebėtojui šie skaičiai iš tikrųjų yra atsitiktiniai. Nebus trumpų pasikartojančių sekų, ir bent jau žmogaus stebėtojui jos nepateiks aiškaus modelio. Tačiau turint pakankamai laiko ir motyvacijos, originalas sėkla galima aptikti, seka atkurta ir atspėti seką sekos numerį.
Dėl šios priežasties šiame straipsnyje aptariami metodai greičiausiai neturėtų būti naudojami skaičiams, kurie turi būti saugūs kriptografiškai, generuoti.
Pseudo-atsitiktinių skaičių generatoriai turi būti sėklų kad būtų sudarytos sekos, kurios skiriasi kiekvieną kartą sukuriant naują atsitiktinį skaičių. Joks metodas nėra stebuklingas - šie, atrodytų, atsitiktiniai skaičiai generuojami naudojant gana paprastus algoritmus ir santykinai paprastą aritmetiką. Sėjant PRNG, jūs kiekvieną kartą paleidžiate jį skirtingu momentu. Jei nedėtumėte dalelės, ji kiekvieną kartą sugeneruotų tą pačią skaičių seką.
Rubyje Branduolio # srand metodas gali būti vadinamas be argumentų. Ji pasirinks atsitiktinio skaičiaus datą pagal laiką, proceso ID ir sekos numerį. Tiesiog paskambinus srand bet kurioje programos pradžioje, kiekvieną kartą paleidus, ji sugeneruos skirtingas, atrodytų, atsitiktinių skaičių eilutes. Šis metodas netiesiogiai vadinamas, kai programa paleidžiama, ir pateikia PRNG su laiko ir proceso ID (be sekos numerio).
Kai programa vykdoma ir Branduolio # srand buvo netiesiogiai arba tiesiogiai vadinamas Branduolys # radas metodas gali būti vadinamas. Šis metodas, vadinamas be argumentų, gaus atsitiktinį skaičių nuo 0 iki 1. Anksčiau šis skaičius paprastai buvo mažinamas iki maksimalaus skaičiaus, kurį norėtumėte sugeneruoti ir galbūt to_i paragino jį konvertuoti į sveikąjį skaičių.
Tačiau, jei naudojate „Ruby 1.9.x“, „Ruby“ viskas šiek tiek palengvėja. Branduolys # radas metodas gali paimti vieną argumentą. Jei šis argumentas yra a Skaitinis bet kokio tipo, „Ruby“ sugeneruos sveiką skaičių nuo 0 iki (ir neįskaitant) to skaičiaus.
Tačiau ką daryti, jei norite sugeneruoti skaičių nuo 10 iki 15? Paprastai sugeneruotumėte skaičių nuo 0 iki 5 ir pridėtumėte jį prie 10. Tačiau „Ruby“ tai palengvina.
Įsitikinkite, kad atkreipiate dėmesį į dviejų tipų diapazonus. Jei paskambinote Randa (10..15), tai sugeneruotų skaičių nuo 10 iki 15 įskaitant 15. Kadangi Randa (10... 15) (su 3 taškais) sugeneruotų skaičių nuo 10 iki 15 neįeina 15.
Kartais jums reikalinga atsitiktinai atrodanti skaičių seka, tačiau kiekvieną kartą reikia sugeneruoti tą pačią seką. Pvz., Jei vieneto testo metu sugeneruojate atsitiktinius skaičius, kiekvieną kartą turėtumėte sugeneruoti tą pačią skaičių seką.
Vienos sekos nesėkmingas vieneto testas turėtų vėl nepavykti kitą kartą paleidžiant. Jei kitą kartą sugeneravo skirtumų seką, jis gali nepavykti. Norėdami tai padaryti, paskambinkite Branduolio # srand turinti žinomą ir pastovią vertę.
Įgyvendinimas Branduolys # radas yra gana ne Ruby. Jokiu būdu jis neišskiria PRNG ir neleidžia jums atlikti PRNG. PRNG yra viena pasaulinė valstybė, kuriai priklauso visi kodai. Jei pakeisite sėklą ar kitaip pakeisite PRNG būklę, tai gali turėti platesnį efektą, nei tikėjotės.
Tačiau kadangi programos tikisi, kad šio metodo rezultatas bus atsitiktinis - toks yra jo tikslas! - tai greičiausiai niekada nebus problema. Tik tuo atveju, jei programa tikisi pamatyti numatomą skaičių seką, pavyzdžiui, jei būtų paskambinusi srand turint pastovią vertę, ar ji turėtų pamatyti netikėtų rezultatų?