back to top

Numeri Random in JavaScript

La generazione di numeri random (numeri casuali) è un’operazione comune in JavaScript, utile in vari contesti come giochi, crittografia, simulazioni e algoritmi.

JavaScript offre strumenti nativi per ottenere numeri casuali, ma esistono anche librerie avanzate che migliorano la casualità e la sicurezza.

Pubblicità

In questo articolo esploreremo il metodo Math.random(), vedremo come generare numeri casuali in intervalli specifici, e analizzeremo soluzioni più avanzate per garantire una casualità più robusta.

Il metodo Math.random()

JavaScript mette a disposizione il metodo Math.random(), una funzione che genera un numero pseudo-casuale in virgola mobile compreso tra 0 (incluso) e 1 (escluso). Questo significa che il valore restituito sarà sempre maggiore o uguale a 0, ma mai esattamente 1.

console.log(Math.random()); // Output: un numero decimale tra 0 e 0.999999...

Sebbene Math.random() sia utile per molte applicazioni, spesso è necessario adattare il valore generato a un intervallo specifico o convertirlo in un numero intero… nei prossimi esempi vedremo utilizzi pratici di questo metodo.

Generare numeri casuali in un intervallo specifico

Numeri interi in un intervallo

Per ottenere un numero intero casuale compreso tra un valore minimo e massimo, possiamo utilizzare il seguente snippet di codice:

function getRandomInt(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

console.log(getRandomInt(1, 10)); // Output: un numero intero tra 1 e 10

Cerchiamo di capire come funziona questo codice:

  • Math.random() genera un numero tra 0 e 1 (escluso).
  • Moltiplichiamo il risultato per (max – min + 1), ottenendo un valore nell’intervallo [0, max-min].
  • Usiamo Math.floor() per arrotondare al numero intero inferiore.
  • Infine, aggiungiamo min per spostare l’intervallo nel range desiderato.

Numeri decimali in un intervallo

Nel codice visto sopra abbiamo generato un numero casuale intero… ma se volessimo ottenere un numero decimale in un range specifico? Vediamo come fare:

function getRandomFloat(min, max) {
    return Math.random() * (max - min) + min;
}

console.log(getRandomFloat(1.5, 5.5)); // Output: un numero decimale tra 1.5 e 5.5

Generare numeri casuali in Javascript di N cifre

Una funzione che ritengo molto comoda è quella che consente di generare numeri casuali di una lunghezza specifica (ad es. di 5 cifre). Vediamo la funzione:

function getRandomNumberWithNDigits(n) {
    if (n <= 0) {
        throw new Error("Il numero di cifre deve essere maggiore di zero.");
    }
    
    let min = Math.pow(10, n - 1); // Minimo valore con N cifre
    let max = Math.pow(10, n) - 1; // Massimo valore con N cifre
    
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

// Esempi di utilizzo:
console.log(getRandomNumberWithNDigits(3)); // Output: un numero casuale tra 100 e 999
console.log(getRandomNumberWithNDigits(5)); // Output: un numero casuale tra 10000 e 99999
console.log(getRandomNumberWithNDigits(8)); // Output: un numero casuale tra 10000000 e 99999999

Questa funzione è utile per generare numeri di lunghezza fissa, ad esempio per OTP, PIN casuali o numeri di carte di credito fittizi per scopi di test.

Generare numeri casuali crittograficamente sicuri

Il metodo Math.random() utilizza un algoritmo pseudo-casuale che, pur essendo adatto alla maggior parte delle applicazioni comuni, non è abbastanza sicuro per usi crittografici. Questo perché i numeri generati potrebbero essere prevedibili con un’analisi statistica avanzata.

Per applicazioni che richiedono un livello di sicurezza più elevato, come generazione di password, token di autenticazione o chiavi di crittografia, JavaScript fornisce l’API crypto.getRandomValues(), che genera numeri casuali con maggiore entropia, utilizzando il generatore di numeri casuali del sistema operativo.

Come utilizzare crypto.getRandomValues()

L’API crypto.getRandomValues() permette di riempire un array con numeri casuali a 8, 16 o 32 bit. Ecco un esempio di utilizzo per ottenere un numero intero casuale in un intervallo specifico:

function getSecureRandomInt(min, max) {
    const range = max - min + 1;
    const randomBuffer = new Uint32Array(1);
    window.crypto.getRandomValues(randomBuffer);
    return min + (randomBuffer[0] % range);
}

console.log(getSecureRandomInt(1, 100)); // Output: un numero intero sicuro tra 1 e 100

Perché crypto.getRandomValues() è più sicuro?

  • Usa un generatore di numeri casuali del sistema operativo, che è più imprevedibile rispetto a Math.random().
  • Fornisce numeri distribuiti in modo uniforme, riducendo il rischio di schemi prevedibili.
  • Non può essere manipolato dall’utente, aumentando la resistenza agli attacchi.

Utilizzare questa API è assolutamente utile in contesti critici dove un elevato grado di sicurezza è indispensabile, viceversa non è necessario quando servono numeri casuali per applicazioni non critiche, come giochi, animazioni o semplici simulazioni.

Librerie Javascript per la generazione di numeri casuali

Se hai bisogno di funzionalità avanzate per la generazione randomica, puoi fare ricorso a librerie esterne come:

Chance.js

Chance.js è una libreria JavaScript leggera progettata per generare dati casuali, inclusi numeri, stringhe, date, indirizzi e-mail, colori, nomi e molto altro. È particolarmente utile per test, simulazioni e generazione di dati fittizi in applicazioni web.

const chance = require('chance').Chance();
console.log(chance.integer({ min: 1, max: 100 })); // Numero intero tra 1 e 100
console.log(chance.floating({ min: 0, max: 1 })); // Numero decimale tra 0 e 1

Random.js

Random.js è una libreria JavaScript avanzata per la generazione di numeri casuali con diverse distribuzioni statistiche. È ideale per applicazioni che richiedono una casualità più controllata rispetto a Math.random(), come simulazioni, machine learning e giochi.

const Random = require('random');
console.log(random.int(1, 100));  // Numero intero tra 1 e 100
console.log(random.float(0, 1));  // Numero decimale tra 0 e 1

Applicazioni pratiche della generazione di numeri random in Javascript

La generazione di numeri casuali è una funzionalità essenziale in molti ambiti dello sviluppo software. Dai giochi alla sicurezza informatica, passando per la simulazione di dati e l’intelligenza artificiale, i numeri casuali vengono utilizzati per creare esperienze dinamiche e imprevedibili.

Al fine di fornire una panoramica completa illustreremo di seguito alcune applicazioni pratiche della casualità in JavaScript, mostrando come implementare funzionalità utili come il lancio di un dado, la selezione casuale da un array, la generazione di password sicure.

Simulare il lancio di un dado

Il lancio di un dado è un esempio classico dell’uso di numeri casuali nei giochi. In questo caso, genereremo un numero intero casuale tra 1 e 6, simulando il comportamento di un dado reale.

function rollDice() {
    return getRandomInt(1, 6);
}

console.log(rollDice()); // Output: un numero da 1 a 6

Selezione casuale da un array

Quando abbiamo una lista di elementi e vogliamo sceglierne uno in modo casuale, possiamo usare Math.random(). Questo metodo è utile, ad esempio, per selezionare casualmente un utente, un colore o una frase da mostrare.

function getRandomElement(arr) {
    return arr[Math.floor(Math.random() * arr.length)];
}

console.log(getRandomElement(["rosso", "blu", "verde"])); // Output: uno dei colori

Generazione di una password casuale

Per aumentare la sicurezza nelle applicazioni, spesso è necessario generare password casuali. In questo esempio, creiamo una password alfanumerica casuale di lunghezza variabile utilizzando Math.random().

function generateRandomPassword(length) {
    const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    let password = "";
    for (let i = 0; i < length; i++) {
        password += chars.charAt(Math.floor(Math.random() * chars.length));
    }
    return password;
}

console.log(generateRandomPassword(8)); // Output: password casuale di 8 caratteri

Conclusioni

La generazione di numeri casuali in JavaScript non è un semplice esercizio matematico, ma una scelta strategica che dipende dal contesto e dagli obiettivi dell’applicazione. Se per compiti di base come giochi, animazioni o selezioni casuali un semplice Math.random() è più che sufficiente, scenari più complessi come crittografia, sicurezza o simulazioni statistiche richiedono strumenti più avanzati.

L’uso di crypto.getRandomValues() è indispensabile quando è necessaria un’elevata imprevedibilità, come nella generazione di token sicuri o chiavi di cifratura. D’altra parte, librerie come Chance.js e Random.js ampliano le possibilità, offrendo controlli raffinati sulla casualità e permettendo di lavorare con distribuzioni probabilistiche più sofisticate.

In definitiva, comprendere come e quando utilizzare ogni metodo non solo migliora la robustezza del codice, ma apre anche nuove possibilità nel design di applicazioni più sicure, dinamiche e affidabili. La casualità non è mai del tutto casuale: la vera abilità sta nel saperla controllare e sfruttare al meglio.

Domande Frequenti

Math.random() è davvero casuale?

No, Math.random() usa un algoritmo pseudo-casuale e non è adatto per applicazioni crittografiche.

Come generare numeri casuali crittograficamente sicuri?

Usa crypto.getRandomValues() per ottenere numeri casuali più affidabili per la sicurezza.

Come generare un numero casuale senza ripetizioni?

Puoi generare un array() in cui memorizzi i valori già elaborati e prima di restituirne uno nuovo verifichi se è presente o meno nell’array. In caso affermativo genererai un nuovo risultato.

Altri contenuti interessanti

Pubblicità

Potrebbero interessarti queste guide

Massimiliano Bossi
Massimiliano Bossi
Stregato dalla rete sin dai tempi delle BBS e dei modem a 2.400 baud, ho avuto la fortuna di poter trasformare la mia passione in un lavoro (nonostante una Laurea in Giurisprudenza). Adoro scrivere codice e mi occupo quotidianamente di comunicazione, design e nuovi media digitali. Orgogliosamente "nerd" sono il fondatore di MRW.it (per il quale ho scritto centinaia di articoli) e di una nota Web-Agency (dove seguo in prima persona progetti digitali per numerosi clienti sia in Italia che all'estero).

Leggi anche...

Infinite scroll, come programmarlo su AMP e su Web con Javascript

L'infinite scroll è una tecnica di design e navigazione...

Codice Fiscale: 5 javascript per la verifica e il calcolo

Il codice fiscale è un identificativo tributario univoco che...

Math.ceil() – Arrotondare per eccesso con Javascript

Il metodo ceil() dell'oggetto Math di Javascript è utilizzato...

Minificare Javascript: librerie e strumenti online per comprimere il sorgente JS

La minificazione è un processo abbastanza diffuso nell'implementazione delle...

Javascript: svuotare un campo input o una textarea con un click

Quando si fornisce agli utenti un modulo per l'inserimento...

6 video player HTML5 per il tuo sito web

Con il rilascio delle specifiche definitive per HTML5 molte...
Pubblicità