Kas olete kunagi mõelnud, kuidas Math.random() töötab? Mis on juhuslik arv ja kuidas see saadakse? Kujutage ette intervjuu küsimust – kirjutage oma juhuslike numbrite generaator paari koodireale. Niisiis, mis see on, õnnetus ja kas seda on võimalik ennustada?

Mind köidavad väga erinevad IT-mõistatused ja ülesanded ning juhuslike numbrite generaator on üks nendest ülesannetest. Tavaliselt analüüsin oma Telegrami kanalis igasuguseid mõistatusi ja erinevaid intervjuudest saadud ülesandeid. Juhuslike arvude generaatori probleem on saavutanud suure populaarsuse ja ma tahtsin seda põlistada ühe autoriteetse teabeallika sügavuses - see tähendab siin Habré's.

See materjal on kasulik kõigile neile esiotsa ja Node.js arendajatele, kes on tehnoloogia tipptasemel ja soovivad sattuda plokiahela projekti/käivitusse, kus isegi esiotsa arendajatele esitatakse küsimusi turvalisuse ja krüptograafia kohta. vähemalt algtasemel.

Pseudojuhuslike arvude generaator ja juhuslike arvude generaator

Millegi juhusliku saamiseks vajame entroopia allikat, mingi kaose allikat, millest me juhuslikkuse genereerimiseks kasutame.

Seda allikat kasutatakse entroopia kogumiseks ja seejärel algväärtuse (seeme) saamiseks, mis on vajalik juhuslike arvude generaatoritele (RNG) juhuslike arvude genereerimiseks.

Pseudojuhuslike numbrite generaator kasutab ühte seemet, seega ka pseudojuhuslikkust, samas kui juhuslike numbrite generaator genereerib alati juhusliku arvu, alustades kvaliteetsest juhuslikust muutujast, mis on saadud erinevatest entroopiaallikatest.

Entroopia on korratuse mõõt. Info entroopia on teabe määramatuse või ettearvamatuse mõõt.
Selgub, et pseudojuhusliku jada loomiseks vajame algoritmi, mis genereerib kindla jada kindla valemi alusel. Kuid sellist järjestust saab ennustada. Kujutagem siiski ette, kuidas saaksime kirjutada oma juhuslike arvude generaatori, kui meil poleks Math.random()

PRNG-l on algoritm, mida saab reprodutseerida.
RNG on protsess, mille käigus saadakse arvud täielikult mingist mürast, mille arvutamise võimalus kipub nulli. Samal ajal on RNG-l teatud algoritmid jaotuse võrdsustamiseks.

Me mõtleme välja oma PRNG-algoritmi

Pseudojuhuslike arvude generaator (PRNG) on algoritm, mis genereerib arvude jada, mille elemendid on üksteisest peaaegu sõltumatud ja järgivad etteantud jaotust (tavaliselt ühtlast).
Võime võtta mõne arvu jada ja võtta neist arvu mooduli. Lihtsaim näide, mis meelde tuleb. Peame mõtlema, millist järjestust võtta ja millest moodulit võtta. Kui teete 0-st N ja moodulist 2 otse, saate generaatori 1 ja 0:

Funktsioon* rand() ( const n = 100; const mod = 2; olgu i = 0; while (tõene) ( tootlus i % mod; kui (i++ > n) i = 0; ) ) olgu i = 0; for (lase x rand()) ( kui (i++ > 100) katkeb; console.log(x); )
See funktsioon genereerib jada 01010101010101... ja seda ei saa isegi pseudojuhuslikuks nimetada. Selleks, et generaator oleks juhuslik, peab see läbima järgmise bititesti. Kuid meil pole sellist ülesannet. Sellegipoolest saame ka ilma igasuguste testideta ennustada järgmist jada, mis tähendab, et selline algoritm ei sobi, kuid oleme õiges suunas.

Mis siis, kui võtame mõne tuntud, kuid mittelineaarse jada, näiteks arvu PI. Ja mooduli väärtuseks võtame mitte 2, vaid midagi muud. Võite isegi mõelda mooduli muutuva väärtuse peale. Pi numbrite jada loetakse juhuslikuks. Generaator saab töötada Pi-arvude abil, alustades mõnest tundmatust punktist. Sellise PI-põhise jada ja muutujamooduliga algoritmi näide:

Const vektor = [...Math.PI.toFixed(48).asendada(".","")]; function* rand() ( for (olgu i=3; i<1000; i++) { if (i >99) i = 2; jaoks (olgu n = 0; n Kuid JS-is saab PI-numbrit kuvada ainult kuni 48 numbrit ja mitte rohkem. Seetõttu on sellist jada siiski lihtne ennustada ja iga sellise generaatori käitamine annab alati samu numbreid. Kuid meie generaator on juba hakanud näitama numbreid 0-st 9-ni.

Saime arvude generaatori 0 kuni 9, kuid jaotus on väga ebaühtlane ja see genereerib iga kord sama jada.

Võime võtta mitte arvu Pi, vaid aja numbrilises esituses ja käsitleda seda arvu numbrite jadana ning selleks, et jada iga kord ei korduks, loeme seda lõpust. Kokkuvõttes näeb meie PRNG algoritm välja järgmine:

Funktsioon* rand() ( olgu newNumVector = () => [...(+new Date)+""].reverse(); olgu vektor = newNumVector(); olgu i=2; while (tõene) ( ​​kui ( i++ > 99) i = 2, olgu n=-1;< vector.length) yield (vector[n] % i); vector = newNumVector(); } } // TEST: let i = 0; for (let x of rand()) { if (i++ >100) vaheaeg; console.log(x)
See näeb juba välja nagu pseudojuhuslike numbrite generaator. Ja seesama Math.random() on PRNG, räägime sellest veidi hiljem. Pealegi saame iga kord erineva esinumbri.

Tegelikult saate nende lihtsate näidete abil mõista, kuidas keerulisemad juhuslike arvude generaatorid töötavad. Ja seal on isegi valmis algoritme. Näitena vaatleme ühte neist —see on lineaarne kongruent PRNG (LCPRNG).

Lineaarne kongruentne PRNG

Lineaarne kongruentne PRNG (LCPRNG) on levinud meetod pseudojuhuslike arvude genereerimiseks. See ei ole krüptograafiliselt tugev. See meetod seisneb lineaarse korduva jada liikmete arvutamises mõne naturaalarvu m mooduli järgi, mis on antud valemiga. Saadud jada oleneb stardinumbri valikust — st. seeme. Erinevate algväärtustega saadakse erinevad juhuslike arvude jadad. Näide sellise algoritmi rakendamisest JavaScriptis:

Const a = 45; const c = 21; konst m = 67; var seeme = 2; const rand = () => seeme = (a * seeme + c) % m; for(olgu i=0; i<30; i++) console.log(rand())
Paljud programmeerimiskeeled kasutavad LCPRNG-d (kuid mitte täpselt seda algoritmi (!)).

Nagu eespool mainitud, saab sellist järjestust ennustada. Miks me siis PRNG-d vajame? Kui me räägime turvalisusest, siis PRNG on probleem. Kui räägime muudest ülesannetest, siis need omadused võivad olla plussiks. Näiteks erinevate eriefektide ja graafika animatsioonide puhul peate võib-olla sageli helistama juhuslikult. Ja siin on oluline tähenduste jaotus ja sooritus! Turvalised algoritmid ei saa kiirusega kiidelda.

Teine omadus on reprodutseeritavus. Mõned teostused võimaldavad teil määrata seemne ja see on väga kasulik, kui jada tuleb korrata. Paljundamine on vajalik näiteks katsetes. Ja on palju muid asju, mis ei nõua turvalist RNG-d.

Kuidas Math.random() töötab

Meetod Math.random() tagastab pseudojuhusliku ujukomaarvu vahemikust = crypto.getRandomValues(new Uint8Array(1)); console.log(rvalue)
Kuid erinevalt Math.random() PRNG-st on see meetod väga ressursimahukas. Fakt on see, et see generaator kasutab entroopiaallikatele (mac-aadress, protsessor, temperatuur jne) juurdepääsu saamiseks OS-is süsteemikutseid.

Juhuslike numbrite genereerimiseks vajalikus vahemikus on kõige parem kasutada veebipõhist juhuslike numbrite generaatorit. Suure hulga valikute olemasolu võimaldab teil valida vajaliku arvu juhuslikke numbreid, samuti määrata lõplikud ja algväärtused.

Interneti-numbrigeneraatori (randomiseerija) juhised:

Vaikimisi sisestatakse juhuslike arvude generaatorisse 1 arv. Kui muudate rakenduse sätteid, saate üheaegselt genereerida kuni 250 juhuslikku numbrit. Kõigepealt peate määrama vahemiku. Maksimaalne arvu väärtus on 9 999 999 999 Juhuslike numbrite generaator võimaldab sorteerida numbreid kahanevas, kasvavas või juhuslikus järjekorras.

Tulemuse kuvamiseks võite kasutada erinevaid eraldajaid: semikoolonit, koma ja tühikut. Lisaks võivad esineda kordused. Valik „Välista kordused” võimaldab teil dubleerimistest vabaneda. Samuti saate saata lingi tehtud arvutustele messengeri või meili teel, kopeerides "Link tulemusele".

Palun aidake teenust ühe klõpsuga: Rääkige oma sõpradele generaatorist!

Interneti-numbrigeneraator ühe klõpsuga

Meie veebisaidil olev juhuslike arvude generaator on väga mugav. Näiteks saab seda kasutada loosimistes ja loteriides võitja selgitamiseks. Võitjad määratakse sel viisil: programm toodab ühe või mitu numbrit mis tahes teie määratud vahemikus. Petturlikud tulemused saab kohe välistada. Ja tänu sellele selgitab võitja välja aus valik.

Mõnikord on vaja korraga saada teatud arv juhuslikke arve. Näiteks soovite täita loosipileti "4 35-st", usaldades juhust. Saate kontrollida: kui viskate münti 32 korda, siis kui suur on tõenäosus, et järjest ilmub 10 pööret (peadele/sabadele võib vabalt omistada numbrid 0 ja 1)?

Juhuslike arvude veebivideo juhendamine – randomiseerija

Meie numbrigeneraatorit on väga lihtne kasutada. See ei nõua programmi arvutisse allalaadimist – seda saab kasutada võrgus. Vajaliku numbri saamiseks tuleb määrata juhuslike numbrite vahemik, kogus ja soovi korral numbrieraldaja ning välistada kordused.

Juhuslike arvude genereerimiseks kindlas sagedusvahemikus tehke järgmist.

  • Valige vahemik;
  • Määrake juhuslike arvude arv;
  • Numbrieraldaja funktsioon tagab nende kuvamise ilu ja mugavuse;
  • Vajadusel lubage/keelake kordused, kasutades märkeruutu;
  • Klõpsake nuppu "Genereeri".

Selle tulemusena saate antud vahemikus juhuslikke numbreid. Numbrigeneraatori tulemust saab kopeerida või saata e-postiga. Parim oleks sellest genereerimisprotsessist teha ekraanipilt või video. Meie randomiseerija lahendab kõik teie probleemid!

Meil on arvude jada, mis koosneb praktiliselt sõltumatutest elementidest, mis järgivad antud jaotust. Reeglina ühtlane jaotus.

Juhuslikke numbreid saate Excelis genereerida erineval viisil ja viisidel. Vaatleme neist ainult parimaid.

Juhuslike arvude funktsioon Excelis

  1. Funktsioon RAND tagastab juhusliku ühtlaselt jaotatud reaalarvu. See on väiksem kui 1, suurem kui 0 või sellega võrdne.
  2. Funktsioon RANDBETWEEN tagastab juhusliku täisarvu.

Vaatame nende kasutamist näidetega.

Juhuslike arvude valimine RAND-i abil

See funktsioon ei vaja argumente (RAND()).

Näiteks juhusliku reaalarvu vahemikus 1 kuni 5 genereerimiseks kasutage järgmist valemit: =RAND()*(5-1)+1.

Tagastatud juhuslik arv jaotatakse intervalli peale ühtlaselt.

Iga kord, kui tööleht arvutatakse või töölehe mis tahes lahtri väärtus muutub, tagastatakse uus juhuslik arv. Kui soovite genereeritud populatsiooni salvestada, saate valemi asendada selle väärtusega.

  1. Klõpsake juhusliku arvuga lahtrit.
  2. Valige valemiribal valem.
  3. Vajutage F9. JA SISESTAGE.

Kontrollime esimese valimi juhuslike arvude jaotuse ühtlust jaotuse histogrammi abil.


Vertikaalsete väärtuste vahemik on sagedus. Horisontaalne - “taskud”.



RANDBETWEEN funktsioon

Funktsiooni RANDBETWEEN süntaks on (alumine piir; ülemine piir). Esimene argument peab olema teisest väiksem. Vastasel juhul annab funktsioon veateate. Eeldatakse, et piirid on täisarvud. Valem jätab murdosa kõrvale.

Funktsiooni kasutamise näide:

Juhuslikud arvud täpsusega 0,1 ja 0,01:

Kuidas teha Excelis juhuslike arvude generaatorit

Teeme juhuslike arvude generaatori, mis genereerib väärtuse teatud vahemikust. Kasutame sellist valemit nagu: =INDEKS(A1:A10,TÄISARV(RAND()*10)+1).

Teeme juhuslike arvude generaatori vahemikus 0 kuni 100 sammuga 10.

Peate valima tekstiväärtuste loendist 2 juhuslikku. Funktsiooni RAND abil võrdleme tekstiväärtusi vahemikus A1:A7 juhuslike arvudega.

Kasutame funktsiooni INDEX, et valida algsest loendist kaks juhuslikku tekstiväärtust.

Loendist ühe juhusliku väärtuse valimiseks kasutage järgmist valemit: =INDEX(A1:A7,RANDBETWEEN(1,COUNT(A1:A7))).

Normaaljaotusega juhuslike arvude generaator

Funktsioonid RAND ja RANDBETWEEN toodavad ühtlase jaotusega juhuslikke numbreid. Iga sama tõenäosusega väärtus võib langeda soovitud vahemiku alumisse ja ülemisse piiri. Selle tulemuseks on suur erinevus sihtväärtusest.

Normaaljaotus tähendab, et suurem osa genereeritud arvudest on sihtarvu lähedal. Kohandame valemit RANDBETWEEN ja loome normaaljaotusega andmemassiivi.

Toote X maksumus on 100 rubla. Kogu toodetud partii järgib normaaljaotust. Juhuslik suurus järgib ka normaalset tõenäosusjaotust.

Sellistes tingimustes on vahemiku keskmine väärtus 100 rubla. Loome massiivi ja koostame normaaljaotusega graafiku standardhälbega 1,5 rubla.

Kasutame funktsiooni: =NORMINV(RAND();100;1.5).

Excel arvutas välja, millised väärtused olid tõenäosusvahemikus. Kuna 100 rubla maksumusega toote valmistamise tõenäosus on maksimaalne, näitab valem 100-le lähedasi väärtusi sagedamini kui teised.

Liigume edasi graafiku joonistamise juurde. Kõigepealt peate looma kategooriatega tabeli. Selleks jagame massiivi perioodideks:

Saadud andmete põhjal saame koostada normaaljaotusega diagrammi. Väärtustelg on muutujate arv intervallis, kategooriatelg on perioodid.

Esitatud veebipõhine juhuslike arvude generaator töötab pseudojuhuslike arvude generaatoril, millel on JavaScripti sisse ehitatud ühtlane jaotus. Täisarvud genereeritakse. Vaikimisi väljastatakse 10 juhuslikku numbrit vahemikus 100...999, numbrid on eraldatud tühikutega.

Juhuslike arvude generaatori põhiseaded:

  • Numbrite hulk
  • Numbrivahemik
  • Eraldaja tüüp
  • Lülita sisse/välja korduste (numbrite duplikaatide) eemaldamise funktsioon

Koguarv on ametlikult piiratud 1000-ga, maksimaalselt 1 miljard. Eraldaja valikud: tühik, koma, semikoolon.

Nüüd teate täpselt, kust ja kuidas Internetist saada tasuta juhuslike numbrite jada antud vahemikus.

Juhuslike arvude generaatori rakendusvõimalused

Juhuslike numbrite generaator (JS-s ühtlase jaotusega RNG) on kasulik SMM-i spetsialistidele ning gruppide ja kogukondade omanikele sotsiaalvõrgustikes Instagram, Facebook, VKontakte, Odnoklassniki, et määrata loteriide, võistluste ja loosimiste võitjad.

Juhuslike arvude generaator võimaldab teil loosida auhindu suvalise arvu osalejate vahel, kellel on kindel võitjate arv. Võistlusi saab korraldada ilma korduspostituste ja kommentaarideta - osalejate arvu ja juhuslike numbrite genereerimise intervalli määrate ise. Sellel saidil saate veebist ja tasuta hankida juhuslike numbrite komplekti ning te ei pea oma nutitelefoni ega arvutisse ühtegi programmi installima.

Samuti saab mündi või täringu viskamise simuleerimiseks kasutada veebipõhist juhuslike arvude generaatorit. Siiski on meil nende juhtumite jaoks eraldi spetsialiseeritud teenused.