Kā ģenerēt nejaušus skaitļus rubīnā

click fraud protection

Lai gan neviens dators nevar ģenerēt patiesi nejaušus skaitļus, Ruby nodrošina piekļuvi metodei, kas atgriezīsies pseidodoklis skaitļi.

Neviens dators nevar ģenerēt patiesi izlases skaitļi tīri pēc aprēķiniem. Labākais, ko viņi var darīt, ir radīt pseidodoklis skaitļi, kas ir skaitļu secība, kas parādās izlases, bet nav.

Novērotājam šie skaitļi patiešām ir nejauši. Nebūs īsu atkārtojošu secību, un vismaz cilvēkam novērotājam tās nesniegs skaidru zīmējumu. Tomēr, ņemot vērā pietiekami daudz laika un motivācijas, oriģināls sēkla var atklāt, secība tiek atjaunota un uzminēts nākamais kārtas numurs.

Šī iemesla dēļ šajā rakstā aplūkotās metodes, iespējams, nevajadzētu izmantot, lai ģenerētu ciparus, kuriem jābūt kriptogrāfiski drošiem.

Pseidodēmisku numuru ģeneratoriem jābūt iesēts lai iegūtu secības, kas atšķiras katru reizi, kad tiek ģenerēts jauns izlases numurs. Neviena metode nav maģiska - šie šķietami nejaušie skaitļi tiek ģenerēti, izmantojot samērā vienkāršus algoritmus un samērā vienkāršu aritmētiku. Sējot PRNG, jūs katru reizi to sākat izmantot citā brīdī. Ja jūs to nesētu, tas katru reizi ģenerētu to pašu numuru secību.

instagram viewer

Rubīnā, Kodols # srand metodi var nosaukt bez argumentiem. Tas izvēlēsies nejauša skaitļa sēklu, pamatojoties uz laiku, procesa ID un kārtas numuru. Vienkārši zvanot srand jebkur programmas sākumā tas katru reizi palaižot ģenerēs atšķirīgu šķietami nejaušu skaitļu sēriju. Šī metode tiek netieši izsaukta, palaižot programmu, un sūta PRNG ar laika un procesa ID (bez kārtas numura).

Kad programma darbojas un Kodols # srand tika netieši vai tieši saukts, Kodols # rand metodi var nosaukt. Šī metode, kas tiek izsaukta bez argumentiem, atgriezīs izlases numuru no 0 līdz 1. Agrāk šis skaitlis parasti tika samazināts līdz maksimālajam skaitam, kuru, iespējams, vēlaties ģenerēt to_i aicināja to pārveidot par veselu skaitli.

Tomēr, izmantojot Ruby 1.9.x, Ruby padara lietu nedaudz vieglāku. Kodols # rand metode var izmantot vienu argumentu. Ja šis arguments ir a Ciparu jebkura veida Rubīns ģenerēs veselu skaitli no 0 līdz (un neieskaitot) šo skaitli.

Tomēr ko darīt, ja vēlaties ģenerēt skaitli no 10 līdz 15? Parasti jūs ģenerējat skaitli no 0 līdz 5 un pievienojat to 10. Tomēr Ruby to padara vieglāku.

Pārliecinieties, ka pievēršat uzmanību divu veidu diapazoniem. Ja jūs zvanītu Rants (10..15), kas ģenerētu skaitli no 10 līdz 15 ieskaitot 15. Tā kā Rants (10... 15) (ar 3 punktiem) ģenerētu skaitli no 10 līdz 15 neskaitot 15.

Dažreiz jums nepieciešama nejauša skaitļu secība, taču katru reizi jāģenerē viena un tā pati secība. Piemēram, ja vienības testā ģenerējat nejaušus skaitļus, jums katru reizi jāģenerē viena un tā pati numuru secība.

Vienības pārbaudei, kas neizdodas vienā secībā, nākamajā reizē, kad tā tiek palaista, vajadzētu atkal neizdoties, ja nākamreiz tā ģenerētu atšķirību secību, tā varētu neizdoties. Lai to izdarītu, zvaniet Kodols # srand ar zināmu un nemainīgu vērtību.

Programmas īstenošana Kodols # rand drīzāk ir bez Rubīna. Tas nekādā veidā neabstrahē PRNG, kā arī neļauj jums uzreiz realizēt PRNG. PRNG ir viena globāla valsts, kurai ir kopīgs kods. Ja maināt sēklu vai citādi maināt PRNG stāvokli, tam var būt plašāks efektu diapazons, nekā jūs gaidījāt.

Tomēr, tā kā programmas sagaida, ka šīs metodes rezultāts būs nejaušs - tas ir tā mērķis! - tā, iespējams, nekad nebūs problēma. Tikai tad, ja programma paredz redzēt paredzamo skaitļu secību, piemēram, ja tā būtu izsaukusi srand ar nemainīgu vērtību, ja tā redz negaidītus rezultātus

instagram story viewer