Oamenii au folosit Aleatoriu numere de milenii, deci conceptul nu este nou. De la loteria din Babilonul antic, la mesele de ruletă din Monte Carlo, până la jocurile cu zaruri în Vegas, scopul este de a lăsa rezultatul final la întâmplare.

Dar jocurile de noroc deoparte, aleatoriu are multe utilizări în știință, statistici, criptografie și multe altele. Cu toate acestea, folosirea zarurilor, monedelor sau a unor suporturi similare ca dispozitiv aleatoriu are limitele sale.

Datorită naturii mecanice a acestor tehnici, generarea unor cantități mari de numere aleatorii necesită mult timp și muncă. Datorită ingeniozității umane, avem la dispoziție instrumente și metode mai puternice.

Metode de generare a numerelor aleatorii

Adevărate numere aleatorii

robot electronic de formă liberă care se uită în jur
Imagine a dispozitivului de procesare cu ieșire digitală cu intrare analogică. Fotografie de Harrison Broadbent

Să luăm în considerare două metode principale utilizate pentru a genera numere aleatorii. prima metodă este bazat pe un proces fizic și recoltează sursa aleatoriei de la un anumit fenomen fizic așteptat a fi aleatoriu.

Un astfel de fenomen are loc în afara computerului. Acesta este măsurat și ajustat pentru posibile prejudecăți datorate procesului de măsurare. Exemplele includ dezintegrarea radioactivă, efectul fotoelectric, radiația cosmică de fond, zgomotul atmosferic (pe care îl vom folosi în acest articol) și multe altele.

Astfel, se spune că numerele aleatorii generate pe baza unei astfel de aleatorii sunt „Adevărat„numere aleatorii.

Din punct de vedere tehnic, partea hardware constă dintr-un dispozitiv care convertește energia de la o formă la alta (de exemplu, radiația într-un semnal electric), un amplificator și un convertor analog-digital pentru a transforma ieșirea într-un număr digital.

Ce sunt numerele pseudorandom?

Cod de atac binar hacker. Fabricat cu Canon 5d Mark III și obiectiv analogic vintage, Leica APO Macro Elmarit-R 2.8 100mm (An: 1993)
Imagine a codului computerului care trece prin ecranul computerului. Fotografie de Markus Spiske.

Ca alternativă la numerele aleatoare “adevărate”, a doua metodă generarea de numere aleatoare implică algoritmi de calcul care pot produce rezultate aparent aleatorii.

De ce aparent aleatoriu? Deoarece rezultatele finale obținute sunt de fapt complet determinate de o valoare inițială cunoscută și sub denumirea de sămânță valoare sau cheie. Prin urmare, dacă ați ști valoarea cheie și cum funcționează algoritmul, ați putea reproduce aceste rezultate aparent aleatorii.

Generatorii de numere aleatorii de acest tip sunt frecvent numiți Număr pseudorandom generatoare și, ca rezultat, numerele Pseudorandom de ieșire.

Chiar dacă acest tip de generator de obicei nu colectează date din surse de natură aleatorie, o astfel de colectare de chei poate fi posibilă atunci când este necesar.

Să comparăm unele aspecte ale generatoarelor de numere aleatorii adevărate sau TRNGs și generatoare de numere pseudorandom sau PRNGs.

PRNG-urile sunt mai rapide decât TRNG-urile. Datorită naturii lor deterministe, acestea sunt utile atunci când trebuie să redați o secvență de evenimente aleatorii. Acest lucru ajută foarte mult la testarea codului, de exemplu.

Pe de altă parte, TRNG-urile nu sunt periodice și funcționează mai bine în roluri sensibile la securitate, cum ar fi criptarea.

A perioadă este numărul de iterații prin care trece un PRNG înainte de a începe să se repete. Astfel, toate celelalte lucruri fiind egale, un PRNG cu o perioadă mai lungă ar necesita mai multe resurse informatice pentru a prezice și a sparge.

Exemplu de algoritm pentru generatorul de numere pseudo-aleatorii

Un computer execută cod care se bazează pe un set de reguli care trebuie respectate. Pentru PRNG-uri în general, aceste reguli se învârt în jurul următoarelor:

  1. Accept un anumit număr de intrare inițial, adică un semnal sau o cheie.
  2. aplica acea sămânță într-o succesiune de operații matematice pentru a genera rezultatul. Rezultatul este numărul aleatoriu.
  3. Utilizare acel număr rezultat aleatoriu ca sămânță pentru următoarea iterație.
  4. Repeta procesul de emulare a întâmplării.

Acum să vedem un exemplu.

Generatorul Congruențial Liniar

Acest generator produce o serie de numere pseudorandom. Dat fiind o sămânță inițială X0 și parametri întregi A ca multiplicator, b ca increment și m ca modul, generatorul este definit de relația liniară: Xn ≡ (aXn-1 + b) mod m. Sau folosind o sintaxă mai favorabilă programării: Xn = (a * Xn-1 + b)% m.

Fiecare dintre acești membri trebuie să îndeplinească următoarele condiții:

Să creăm o funcție JavaScript care ia valorile inițiale ca argumente și returnează o serie de numere aleatorii de o lungime dată:

	
    // x0=seed; a=multiplier; b=increment; m=modulus; n=desired array length; 
	const linearRandomGenerator = (x0, a, b, m, n) => {
        const results = []
        for (let i = 0; i 

Generatorul Congruențial Liniar este unul dintre cei mai vechi și mai cunoscuți algoritmi PRNG.

În ceea ce privește algoritmii generatori de numere aleatorii care pot fi executate de computere, acestea datează încă din anii 1940 și 50 (an Metoda pătratului mijlociu și Generator Lehmer, de exemplu) și continuă să fie scris astăzi (Xoroshiro128 +, Pătrate RNG, și altele).

Un exemplu de generator de numere aleatorii

Când am decis să scriu acest articol despre încorporarea unui generator de numere aleatorii într-o pagină web, am avut de ales.

Aș fi putut folosi JavaScript Math.random() funcționează ca bază și generează ieșire în numere pseudorandom, așa cum am în articolele anterioare (vezi Diagrama de multiplicare – Codificați tabelul propriilor timpuri).

Dar acest articol în sine este despre generarea de numere aleatorii. Așa că am decis să învăț cum să adun date „adevărate” bazate pe aleatoriu și să vă împărtășesc descoperirea mea.

Deci, mai jos este „adevăratul” Generator de Numere Aleatorii. Setați parametrii și apăsați Generare.

Generator de numere aleatorii adevărat



Binar


Zecimal


Hexadecimal


Rezultat:



Codul preia date de la una dintre API-uri, prin amabilitatea Random.org. Această resursă online are o mulțime de instrumente utile și personalizabile și vine cu o documentație excelentă pentru a merge cu ea.

Aleatoritatea provine din zgomotul atmosferic. Am putut folosi funcții asincrone. Acesta este un beneficiu imens în viitor. Funcția de bază arată astfel:

    // Generates a random number within user indicated interval
   	const getRandom = async (min, max, base) => {
   		const response = await 	fetch("https://www.random.org/integers/?num=1&min="+min+"
    &max="+max+"&col=1&base="+base+"&format=plain&rnd=new")
          	return response.text() 
   	} 
    

Parametrii pe care îi iau permit utilizatorului să personalizeze numărul aleatoriu de ieșire. De exemplu, min și max vă permit să setați limite inferioare și superioare pentru ieșirea generată. Și baza determină dacă ieșirea este tipărită ca binară, zecimală sau hexazecimală.

Din nou, am ales această configurație, dar sunt mult mai multe disponibile la sursă.

Când faceți clic pe butonul Generare, handleGenerate() funcția se numește. La rândul său, invocă getRandom() funcție asincronă, gestionează gestionarea erorilor și produce rezultate:

	
    // Output handling
    const handleGenerate = () => {
    	handleActive(generateButton)
        const base = binary.checked ? 2 : decimal.checked ? 10 : 16
        if (!minimum.value || !maximum.value) {
            prompter.style.color="red" 
        	prompter.textContent = "Enter Min & Max values"
        } else {
        	getRandom(minimum.value, maximum.value, base).then((data) => {
        		resultValue.textContent = data
        		prompter.textContent = ""    
        	}).catch((error) => {
        		resultValue.textContent="ERROR"
        		prompter.textContent="Connection error. Unable to 						generate";    
        	})
       		 handleRestart()
        }
        
   }
    

Restul codului se referă la structura, aspectul și stilul HTML.

Codul este gata pentru a fi încorporat și utilizat în această pagină web. L-am separat în părți componente și l-am furnizat cu comentarii detaliate. Poate fi modificat cu ușurință. De asemenea, puteți modifica funcționalitatea și stilurile pe care le necesită nevoile dvs.

Acesta este linkul către repo GitHub a codului complet: https://github.com/sandroarobeli/random-generator