Generator slučajnih brojeva u datom opsegu. Generator slučajnih brojeva za lutriju

23.04.2019

Šta je slučajnost u računaru? Kako nastaje generacija? slučajni brojevi? U ovom članku pokušali smo dati jednostavne odgovore na ova pitanja.

U softveru, iu tehnologiji općenito, postoji potreba za ponovljivom slučajnošću: brojevi i slike koje izgledaju nasumično zapravo se generiraju posebnim algoritmom. To se zove pseudoslučajnost i pogledaćemo jednostavne načine stvaranje pseudoslučajnih brojeva. Na kraju članka ćemo formulirati jednostavnu teoremu za generiranje ovih naizgled slučajnih brojeva.

Utvrđivanje šta tačno predstavlja nesreću može biti prilično teško. izazovan zadatak. Postoje testovi (poput Kolmogorovljeve složenosti) koji vam mogu dati tačna vrijednost koliko je određeni niz slučajan. Ali nećemo se truditi, samo ćemo pokušati stvoriti niz brojeva koji će izgledati nepovezani jedan s drugim.

Često ono što je potrebno nije samo jedan broj, već nekoliko nasumičnih brojeva koji se kontinuirano generiraju. Stoga, s obzirom na početnu vrijednost, moramo kreirati druge slučajne brojeve. Ova početna vrijednost se zove sjeme, a kasnije ćemo vidjeti kako to dobiti. Za sada, hajde da se fokusiramo na kreiranje drugih nasumičnih vrednosti.

Generiranje slučajnih brojeva iz sjemena

Jedan pristup bi mogao biti primjena neke lude matematičke formule na sjeme, zatim ga izokrenuti toliko da se izlazni broj čini nepredvidivim, a zatim to uzeti kao sjeme za sljedeću iteraciju. Pitanje je samo kako bi ova funkcija distorzije trebala izgledati.

Hajde da eksperimentišemo sa ovom idejom i vidimo gde će nas odvesti.

Funkcija distorzije će uzeti jednu vrijednost i vratiti drugu. Nazovimo to R.

R(Input) -> Output

Ako je vrijednost našeg sjemena 1, onda će R stvoriti niz od 1, 2, 3, 4,... Ovo uopće ne izgleda slučajno, ali doći ćemo do toga. Neka R sada doda konstantu umjesto 1.

R(x) = x + c

Ako je c jednako, na primjer, 7, onda dobijamo niz 1, 8, 15, 22, ... Još uvijek nije isti. Očigledno, ono što nam nedostaje je da brojke ne samo da se povećavaju, već ih treba raširiti u nekom rasponu. Potreban nam je naš niz da bismo se vratili na početak - krug brojeva!

Brojčani krug

Pogledajmo brojčanik sata: naš red počinje od 1 i vrti se u krug do 12. Ali pošto radimo sa kompjuterom, neka bude 0 umjesto 12.

Sada počevši od 1 ponovo ćemo dodati 7. Napredak! Vidimo da nakon 12 naša serija počinje da se ponavlja, bez obzira sa kojim brojem započnemo.

Ovdje dobijamo vrlo važno svojstvo: ako se naša petlja sastoji od n elemenata, tada je maksimalni broj elemenata koji možemo dobiti prije nego što počnu da se ponavljaju n.

Sada prepišimo funkciju R da odgovara našoj logici. Možete ograničiti dužinu petlje pomoću operatora modula ili operatora ostatka.

R(x) = (x + c) % m

R (x) = (x + c) % m

U ovom trenutku možete primijetiti da se neki brojevi ne uklapaju u c. Ako je c = 4 i započeli smo od 1, naš niz bi bio 1, 5, 9, 1, 5, 9, 1, 5, 9, ... što naravno ne funkcionira za nas, jer je ovaj niz apsolutno nije nasumično. Postaje jasno da brojevi koje biramo za dužinu petlje i dužinu skoka moraju biti povezani na poseban način.

Ako isprobate nekoliko različitih vrijednosti, možete vidjeti jedno svojstvo: m i c moraju biti međusobno prosti.

Do sada smo pravili skokove zbrajanjem, ali šta ako koristimo množenje? Hajde da se množimo X na konstantu a.

R(x) = (ax + c) % m

R (x) = (ax + c) % m

Svojstva koja se moraju pridržavati da bi se formirao kompletan ciklus su malo specifičnija. Da kreirate ispravnu petlju:

  1. (a - 1) mora biti djeljivo sa svim prostim faktorima m
  2. (a - 1) mora biti deljivo sa 4 ako je m deljivo sa 4

Ova svojstva, zajedno sa pravilom da m i c moraju biti relativno prosti, čine Hull-Dobellov teorem. Nećemo gledati njegov dokaz, ali ako uzmete gomilu različitih vrijednosti za različite konstante, mogli biste doći do istog zaključka.

Odabir sjemena

Sada je vrijeme da razgovaramo o zabavnom dijelu: odabiru početnog sjemena. Mogli bismo to učiniti konstantnom. Ovo može biti korisno u slučajevima kada su vam potrebni nasumični brojevi, ali želite da budu isti svaki put kada pokrenete program. Na primjer, kreiranje iste karte za svaku igru.

Drugi način je da dobijete seme iz novog izvora svaki put kada se program pokrene, kao što je sistemski sat. Ovo je korisno kada vam je potreban ukupan nasumični broj, kao u programu za bacanje kockica.

Konačan rezultat

Kada primijenimo funkciju na njen rezultat nekoliko puta, dobijamo rekurentnu relaciju. Napišimo našu formulu koristeći rekurziju.

Pomoću ovog generatora možete kreirati nasumične brojeve u bilo kojem rasponu. Ovaj generator će vam također omogućiti da nasumično odaberete ili odredite broj sa liste. Ili kreirajte niz slučajnih brojeva od 2 do 70 elemenata. Ovaj online alat ne samo da će vam omogućiti da kreirate jedan (1), dvije (2) ili trocifrene (3) cifre nasumične brojeve, već i pet i sedam. Jednostavan za postavljanje. Svako to može savladati. Također ćete moći odabrati nasumične brojeve za online ili offline lutrije ili takmičenja. I biće zgodno. Možete jednostavno kreirati čitave tabele ili niz nasumičnih brojeva. U djeliću sekunde dobit ćete nasumični broj ili njihov niz (set) na vašem ekranu. Ako uzmete niz svojih brojeva, onda će algoritam izabrati slučajni ili slučajni, svaki može ispasti. I sami možete koristiti ovaj alat za provođenje nagradne igre. Odabirom, na primjer, istog raspona i broja brojeva u rezultatu, možete generirati slučajni niz (kombinaciju). Također možete odabrati nasumične kombinacije slova i riječi. Ovaj alat, kao i sve na našoj stranici, potpuno je besplatan za korištenje (bez izuzetaka).

Unesite brojeve opsega

Od
Prije
Generiraj

Promjena raspona za generiranje slučajnog broja

1..10 1..100 1..1000 1..10000 za lutriju 5 od 36 za lutriju 6 od 45 za lutriju 6 od 49 za lutriju 6 od 59

Broj nasumičnih brojeva (1)

Eliminišite ponavljanja

Odaberite nasumične vrijednosti sa liste (odvojite ih zarezima ili razmacima, ako se zarezi nađu, podjela će biti obavljena njima, inače razmacima)

  • Tutorial

Jeste li se ikada zapitali kako funkcionira Math.random()? Šta je slučajni broj i kako se dobija? Zamislite pitanje za intervju - napišite svoj generator slučajnih brojeva u nekoliko redova koda. Dakle, šta je to, nesreća i da li je moguće to predvidjeti?

Veoma sam fasciniran raznim IT zagonetkama i zadacima, a jedan od tih zadataka je i generator slučajnih brojeva. Obično na svom Telegram kanalu analiziram svakakve zagonetke i razne zadatke iz intervjua. Problem generatora slučajnih brojeva je stekao veliku popularnost i želio sam da ga ovjekovječim u dubinama jednog od autoritativnih izvora informacija - to jest ovdje na Habréu.

Ovaj materijal će biti koristan za sve one front-end i Node.js programere koji su na vrhuncu tehnologije i žele ući u blockchain projekat/startup gdje su pitanja o sigurnosti i kriptografiji barem osnovni nivo, čak pitaju front-end programere.

Generator pseudo-slučajnih brojeva i generator slučajnih brojeva

Da bismo dobili nešto slučajno, potreban nam je izvor entropije, izvor nekog haosa iz kojeg ćemo generirati slučajnost.

Ovaj izvor se koristi za akumulaciju entropije, a zatim za dobijanje početne vrijednosti (seeda), koja je neophodna za generatore slučajnih brojeva (RNG) za generiranje slučajnih brojeva.

Generator pseudo-slučajnih brojeva koristi jednu početnu vrijednost, otuda njegova pseudo-slučajnost, dok generator slučajnih brojeva uvijek generiše slučajni broj, imajući na početku visokokvalitetan broj. slučajna varijabla, koji je uzet iz različitih izvora entropije.

Entropija je mjera nereda. Entropija informacija je mjera nesigurnosti ili nepredvidivosti informacije.
Ispostavilo se da nam je za kreiranje pseudo-slučajnog niza potreban algoritam koji će generirati određeni niz na osnovu određene formule. Ali takav slijed se može predvidjeti. Međutim, zamislimo kako bismo mogli napisati vlastiti generator slučajnih brojeva da nemamo Math.random()

PRNG ima neki algoritam koji se može reproducirati.
RNG je proces dobijanja brojeva u potpunosti iz neke vrste buke, sposobnost izračunavanja koja teži nuli. Istovremeno, RNG ima određene algoritme za izjednačavanje distribucije.

Osmislili smo vlastiti PRNG algoritam

Generator pseudoslučajnih brojeva (PRNG) je algoritam koji generiše niz brojeva čiji su elementi gotovo nezavisni jedan od drugog i poštuju datu distribuciju (obično uniformnu).
Možemo uzeti niz nekih brojeva i od njih uzeti modul broja. Najjednostavniji primjer koji mi pada na pamet. Moramo razmisliti o tome koju sekvencu uzeti i od čega modul. Ako samo direktno od 0 do N i modula 2, dobićete generator od 1 i 0:

Funkcija* rand() ( const n = 100; const mod = 2; neka je i = 0; dok je (true) ( ​​prinos i % mod; ako (i++ > n) i = 0; ) ) neka je i = 0; for (neka x od rand()) (ako je (i++ > 100) break; console.log(x); )
Ova funkcija generiše sekvencu 01010101010101... i ne može se čak ni nazvati pseudo-slučajnom. Da bi generator bio nasumičan, mora proći sljedeći bitni test. Ali mi nemamo takav zadatak. Ipak, i bez ikakvih testova možemo predvidjeti sljedeći niz, što znači da takav algoritam nije prikladan, ali smo na pravom putu.

Šta ako uzmemo neki dobro poznati, ali nelinearan niz, na primjer broj PI. A kao vrijednost za modul ćemo uzeti ne 2, već nešto drugo. Možete čak razmišljati o promjeni vrijednosti modula. Niz cifara u Pi se smatra slučajnim. Generator može raditi koristeći Pi brojeve počevši od neke nepoznate tačke. Primjer takvog algoritma, sa sekvencom zasnovanom na PI i varijabilnim modulom:

Konst vektor = [...Math.PI.toFixed(48).replace(".","")]; funkcija* rand() ( za (neka i=3; i<1000; i++) { if (i >99) i = 2; za (neka je n=0; n Ali u JS-u, PI broj može biti prikazan samo do 48 cifara i ne više. Stoga je još uvijek lako predvidjeti takav niz, a svako pokretanje takvog generatora uvijek će proizvoditi iste brojeve. Ali naš generator je već počeo da prikazuje brojeve od 0 do 9.

Dobili smo generator brojeva od 0 do 9, ali distribucija je vrlo neujednačena i svaki put će generirati isti niz.

Možemo uzeti ne broj Pi, već vrijeme u numeričkom prikazu i posmatrati ovaj broj kao niz brojeva, a kako bismo osigurali da se niz ne ponavlja svaki put, čitat ćemo ga od kraja. Ukupno, naš algoritam za naš PRNG će izgledati ovako:

Funkcija* rand() ( neka noviNumVector = () => [...(+novi datum)+""].reverse(); neka vektor = newNumVector(); neka i=2; dok (true) ( ​​. ako je ( i++ > 99) i = 2, dok je (++n< vector.length) yield (vector[n] % i); vector = newNumVector(); } } // TEST: let i = 0; for (let x of rand()) { if (i++ >100) prekid; console.log(x)
Ovo već izgleda kao generator pseudo-slučajnih brojeva. I isti Math.random() je PRNG, o tome ćemo malo kasnije. Štaviše, svaki put dobijamo drugačiji prvi broj.

Zapravo na ovim jednostavni primjeri Možete razumjeti kako složeniji generatori slučajnih brojeva rade. A postoje čak i gotovi algoritmi. Kao primjer, pogledajmo jedan od njih — ovo je Linearni kongruentni PRNG (LCPRNG).

Linearni kongruentni PRNG

Linearni kongruentni PRNG (LCPRNG) je uobičajena metoda za generiranje pseudoslučajnih brojeva. Nije kriptografski jak. Ova metoda se sastoji od izračunavanja termina linearnog rekurentnog niza po modulu prirodni broj m, dato formulom. Rezultirajući niz zavisi od izbora početnog broja — tj. sjeme. At različita značenja sjeme proizvodi različite nizove slučajnih brojeva. Primjer implementacije takvog algoritma u JavaScript:

Const a = 45; const c = 21; konst m = 67; var sjeme = 2; const rand = () => sjeme = (a * sjeme + c) % m; for(neka i=0; i<30; i++) console.log(rand())
Mnogi programski jezici koriste LCPRNG (ali ne baš ovaj algoritam(!)).

Kao što je gore spomenuto, takav slijed se može predvidjeti. Pa zašto nam je potreban PRNG? Ako govorimo o sigurnosti, onda je PRNG problem. Ako govorimo o drugim zadacima, onda ova svojstva mogu biti plus. Na primjer, za razne specijalne efekte i grafičke animacije, možda ćete morati često pozivati ​​random. I tu su distribucija značenja i performanse važni! Sigurni algoritmi se ne mogu pohvaliti brzinom.

Još jedno svojstvo je ponovljivost. Neke implementacije vam omogućavaju da navedete sjeme, a ovo je vrlo korisno ako se sekvenca mora ponoviti. Reprodukcija je potrebna u testovima, na primjer. I postoje mnoge druge stvari koje ne zahtijevaju siguran RNG.

Kako radi Math.random().

Metoda Math.random() vraća pseudoslučajni broj s pomičnim zarezom iz raspona = crypto.getRandomValues(new Uint8Array(1)); console.log(rvalue)
Ali, za razliku od Math.random() PRNG, ova metoda je veoma intenzivna za resurse. Činjenica je da ovaj generator koristi sistemske pozive u OS-u da bi dobio pristup izvorima entropije (mac adresa, CPU, temperatura, itd...).

Predstavljeni onlajn generator slučajnih brojeva radi na bazi generatora pseudo-slučajnih brojeva sa uniformnom distribucijom ugrađenom u JavaScript. Generiraju se cijeli brojevi. Podrazumevano, 10 nasumičnih brojeva izlaze u rasponu od 100...999, brojevi razdvojeni razmacima.

Osnovne postavke generatora slučajnih brojeva:

  • Količina brojeva
  • Raspon brojeva
  • Tip separatora
  • Uključite/isključite funkciju uklanjanja ponavljanja (duplikata brojeva)

Ukupan broj je formalno ograničen na 1000, sa maksimalno 1 milijardu. Opcije graničnika: razmak, zarez, tačka i zarez.

Sada znate tačno gdje i kako dobiti besplatni niz slučajnih brojeva u datom rasponu na Internetu.

Opcije aplikacije za generator slučajnih brojeva

Generator slučajnih brojeva (RNG u JS-u sa ujednačenom distribucijom) bit će koristan za SMM stručnjake i vlasnike grupa i zajednica na društvenim mrežama Instagram, Facebook, VKontakte, Odnoklassniki za određivanje dobitnika lutrija, natjecanja i izvlačenja nagrada.

Generator slučajnih brojeva vam omogućava da izvučete nagrade između proizvoljnog broja učesnika sa određenim brojem pobednika. Natječaji se mogu održavati bez repostova i komentara - sami postavljate broj učesnika i interval za generiranje slučajnih brojeva. Set nasumičnih brojeva možete dobiti online i besplatno na ovoj stranici i ne morate instalirati nikakvu aplikaciju na svoj pametni telefon ili program na računaru.

Također, online generator slučajnih brojeva može se koristiti za simulaciju bacanja novčića ili kockice. Međutim, za ove slučajeve imamo posebne specijalizovane usluge.

Imamo niz brojeva koji se sastoji od praktično nezavisnih elemenata koji se pokoravaju datoj distribuciji. Po pravilu, ujednačena distribucija.

Možete generirati nasumične brojeve u Excelu na različite načine i metode. Razmotrimo samo najbolje od njih.

Funkcija slučajnog broja u Excelu

  1. Funkcija RAND vraća slučajni, ravnomjerno raspoređeni realni broj. Bit će manji od 1, veći ili jednak 0.
  2. Funkcija RANDBETWEEN vraća nasumični cijeli broj.

Pogledajmo njihovu upotrebu na primjerima.

Uzorkovanje slučajnih brojeva koristeći RAND

Ova funkcija ne zahtijeva argumente (RAND()).

Za generiranje slučajnog realnog broja u rasponu od 1 do 5, na primjer, koristite sljedeću formulu: =RAND()*(5-1)+1.

Vraćeni slučajni broj je ravnomjerno raspoređen u intervalu.

Svaki put kada se izračuna radni list ili se promijeni vrijednost u bilo kojoj ćeliji na radnom listu, vraća se novi nasumični broj. Ako želite sačuvati generiranu populaciju, možete zamijeniti formulu njenom vrijednošću.

  1. Kliknite na ćeliju sa slučajnim brojem.
  2. U traci formule izaberite formulu.
  3. Pritisnite F9. I ENTER.

Provjerimo uniformnost distribucije slučajnih brojeva iz prvog uzorka koristeći histogram distribucije.


Raspon vertikalnih vrijednosti je frekvencija. Horizontalno - "džepovi".



RANDBETWEEN funkcija

Sintaksa za funkciju RANDBETWEEN je (donja granica; gornja granica). Prvi argument mora biti manji od drugog. U suprotnom će funkcija dati grešku. Pretpostavlja se da su granice cijeli brojevi. Formula odbacuje frakcijski dio.

Primjer korištenja funkcije:

Slučajni brojevi sa preciznošću 0,1 i 0,01:

Kako napraviti generator slučajnih brojeva u Excelu

Hajde da napravimo generator slučajnih brojeva koji generiše vrednost iz određenog opsega. Koristimo formulu kao što je: =INDEX(A1:A10,INTEGER(RAND()*10)+1).

Napravimo generator slučajnih brojeva u rasponu od 0 do 100 u koracima od 10.

Potrebno je da izaberete 2 nasumična sa liste tekstualnih vrednosti. Koristeći funkciju RAND, uspoređujemo tekstualne vrijednosti u rasponu A1:A7 sa slučajnim brojevima.

Koristimo funkciju INDEX za odabir dvije nasumične tekstualne vrijednosti sa originalne liste.

Za odabir jedne nasumične vrijednosti sa liste, koristite sljedeću formulu: =INDEX(A1:A7,RANDBETWEEN(1,COUNT(A1:A7))).

Normalna distribucija generator slučajnih brojeva

Funkcije RAND i RANDBETWEEN proizvode slučajne brojeve sa uniformnom distribucijom. Bilo koja vrijednost sa istom vjerovatnoćom može pasti u donju granicu traženog raspona iu gornju. Ovo rezultira velikim rasponom od ciljne vrijednosti.

Normalna distribucija implicira da je većina generiranih brojeva blizu ciljnog broja. Hajde da prilagodimo formulu RANDBETWEEN i napravimo niz podataka sa normalnom distribucijom.

Cijena proizvoda X iznosi 100 rubalja. Cijela proizvedena serija slijedi normalnu distribuciju. Slučajna varijabla također prati normalnu distribuciju vjerovatnoće.

U takvim uslovima, prosječna vrijednost raspona je 100 rubalja. Hajde da generišemo niz i napravimo graf sa normalnom distribucijom sa standardnom devijacijom od 1,5 rubalja.

Koristimo funkciju: =NORMINV(RAND();100;1.5).

Excel je izračunao koje su vrijednosti unutar raspona vjerovatnoće. Budući da je vjerojatnost proizvodnje proizvoda s troškom od 100 rubalja maksimalna, formula pokazuje vrijednosti blizu 100 češće od ostalih.

Pređimo na crtanje grafika. Prvo morate kreirati tabelu sa kategorijama. Da bismo to učinili, podijelimo niz na periode:

Na osnovu dobijenih podataka možemo generisati dijagram sa normalnom distribucijom. Osa vrijednosti je broj varijabli u intervalu, osa kategorije su periodi.