Kako ustvariti naključne številke v Rubyju

Medtem ko noben računalnik ne more ustvariti resnično naključnih števil, Ruby zagotavlja dostop do metode, ki se bo vrnila psevdonamerno številke.

Noben računalnik ne more ustvariti resnično naključna števila zgolj z računanjem. Najboljše, kar lahko storijo, je ustvarjanje psevdonamerno števila, ki so zaporedje števil, ki pojaviti naključno, vendar niso.

Za človeškega opazovalca so te številke res naključne. Kratke zaporedne sekvence ne bo, in vsaj za človeškega opazovalca ne bodo imeli jasnega vzorca. Vendar, glede na dovolj časa in motivacije, original seme lahko odkrijemo, zaporedje poustvarjamo in ugibamo naslednjo številko v zaporedju.

Zaradi tega metode, obravnavane v tem članku, najbrž ne bi smeli uporabljati za ustvarjanje številk, ki morajo biti kriptografsko varne.

Generatorji psevdonamernih števil morajo biti semen da bi ustvarili sekvence, ki se razlikujejo vsakič, ko se ustvari novo naključno število. Nobena metoda ni čarobna - ta na videz naključna števila se generirajo s pomočjo relativno enostavnih algoritmov in relativno preproste aritmetike. S semenom PRNG ga vsakič zaženete na drugem mestu. Če je ne bi posejali, bi vsakokrat ustvaril isto zaporedje števil.

instagram viewer

V Ruby, the Jedro # srand metoda lahko pokličete brez argumentov. Izbralo bo seme naključnih števil glede na čas, ID procesa in zaporedno številko. Preprosto s klicem srand kjer koli na začetku vašega programa bo vsakič, ko ga zaženete, ustvaril drugačno serijo na videz naključnih števil. Ta metoda se prikliče implicitno, ko se program zažene, in PRNG seme z ID-jem časa in procesa (ni zaporedne številke).

Ko se program zažene in Jedro # srand je bilo implicitno ali izrecno imenovano, Kernel # rand metoda se lahko imenuje. Ta metoda, imenovana brez argumentov, bo vrnila naključno število od 0 do 1. V preteklosti je bila ta številka običajno zmanjšana na največje število, ki ga želite ustvariti, in morda to_i ga pozval, da ga pretvori v celo število.

Vendar Ruby stvari nekoliko olajša, če uporabljate Ruby 1.9.x. The Kernel # rand metoda lahko vzame en argument. Če je ta argument a Številčna katere koli vrste, bo Ruby ustvaril celo število od 0 do (in ne vključuje) tega števila.

Toda kaj, če želite ustvariti številko od 10 do 15? Običajno bi ustvarili številko od 0 do 5 in jo dodali na 10. Vendar Ruby olajša.

Bodite pozorni na dve vrsti razponov. Če bi poklical rand (10..15), kar bi ustvarilo številko od 10 do 15 tudi 15. Ker rand (10... 15) (s tremi pikami) bi ustvaril številko od 10 do 15 ne vključuje 15.

Včasih potrebujete naključno videti zaporedje števil, vendar morate vsakič ustvariti isto zaporedje. Na primer, če v enotnem testu ustvarite naključna števila, morate vsakič ustvariti isto zaporedje števil.

Preizkus enote, ki ne uspe pri enem zaporedju, bi moral naslednjič znova spodleteti, če bi naslednjič ustvaril različno zaporedje, morda ne bo uspel. Če želite to narediti, pokličite Jedro # srand z znano in konstantno vrednostjo.

Izvajanje Kernel # rand je precej ne-Ruby. PRNG na noben način ne abstraktira, niti vam ne dovoli, da izročite PRNG. Za PRNG obstaja eno globalno stanje, ki si ga deli vsa koda. Če spremenite seme ali drugače spremenite stanje PRNG, ima lahko širši razpon učinka, kot ste predvidevali.

Ker pa programi pričakujejo, da bo rezultat te metode naključen - to je njen namen! - to verjetno nikoli ne bo problem. Samo, če program pričakuje pričakovano zaporedje številk, na primer, če bi ga poklical srand s konstantno vrednostjo, če ima nepričakovane rezultate.